日期:2014-05-17  浏览次数:20455 次

问个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 TRANSACTION
exec sp_executesql N'INSERT INTO TABLE .........(此处SQL省略)
COMMIT TRANSACTION


但是我在Web上调用却失败了,跟踪得到的SQL如下:
SQL code

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTION
exec 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 完全不必要,可以去掉