问题是:最近有个项目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 完全不必要,可以去掉