当前位置: 代码迷 >> ASP.NET >> 问个NHibernate方面的有关问题 忘解答
  详细解决方案

问个NHibernate方面的有关问题 忘解答

热度:4445   发布时间:2013-02-25 00:00:00.0
问个NHibernate方面的问题 忘解答
问题是:最近有个项目ORM用的是NHibernate,开始到没有遇到什么大问题,但是现在遇到了事务方面的问题。
我在数据的增、删、减、更新里面都使用了事务。
基本代码如下:
C# code
#region 插入一条Channel信息    public int SaveChannelInfo(EPGChannelInfo channelInfo)    {        int channelID = 0;        using (ITransaction tx = _isession.BeginTransaction())        {            try            {                channelID=_isession.Save(channelInfo);                tx.Commit();                return channelID;            }            catch (HibernateException)            {                tx.Rollback();                tx.Dispose();                throw;            }        }    }#endregion

现在的情况是:在Nuint里面测试方法成功执行。跟踪得到的SQL如下:
SQL code
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTIONexec sp_executesql N'INSERT INTO TABLE .........(此处SQL省略)COMMIT TRANSACTION

但是我在Web上调用却失败了,跟踪得到的SQL如下:
SQL code
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTIONexec sp_executesql N'INSERT INTO TABLE .........(此处SQL省略)IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION

发现事务竟然回滚了,闷。

有人可以帮忙解答下这个问题吗?
再一个就是 我代码没有对ISession进行很好的管控,我怀疑是这个问题导致的,如果是这个问题,有人可以提供解决方案吗?

------解决方案--------------------------------------------------------
既然用的是using (ITransaction tx = _isession.BeginTransaction())
它会自动释放的 finally中的 tx.Dispose();可以不要
当然也许是因为你的_isession.Save(channelInfo)这个方法有异常
------解决方案--------------------------------------------------------
1、给出的信息太少了,没办法判断
2、using 的那个地方应该是ISession 对象,不应该是事务。
3、最好封装为单例模式。
------解决方案--------------------------------------------------------
可能的原因是nunit使用的数据是“好的”,而web提交的“坏的”,比如违反了数据库不能为 null 的约束之类的

using 里 try catch 完全不必要,可以去掉
  相关解决方案