当在一个使用中启动事务然后发生异常时会发生什么,但是从不发生回滚,因为没有try-catch回滚?
为了更详细地说明问题,请参阅以下示例: 我们使用工作单元模式来生成业务事务。
工作单元封装在一个使用中。在启动工作单元时,我们可能会开始一项交易(参见下面的示例。)
//Starts a transaction
using (var uow = repositoryFactory.BeginUnitOfWork(true))
{
//do stuff
uow.Commit();
}
使用实体框架启动交易:
CurrentContext.Database.BeginTransaction()
现在的问题是,当"做东西时会发生异常会发生什么?回滚是自动触发的吗?
存储库工厂处理" CurrentContext"如下:
public void Dispose()
{
if (CurrentContext != null)
{
CurrentContext.Dispose();
}
CurrentContext = null;
GC.SuppressFinalize(this);
}
我发现,如果关闭与数据库的连接(s。What happens if you don't commit transaction in a database (say SQL Server)),将关闭一个打开的事务。 问题是,当连接关闭时,它会释放回池中(s。https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx):
当连接关闭时,它会被释放回池中 根据其事务上下文进入适当的细分。 因此,您可以关闭连接而不会产生错误, 即使分布式事务仍处于待处理状态。这允许 您稍后提交或中止分布式事务。
答案 0 :(得分:0)
没有try-catch块,但是有try-finally块,这就是using语句本身,大致相当于以下内容:
var uow = repositoryFactory.BeginUnitOfWork(true);
try
{
//do stuff
uow.Commit();
}
finally {
// pseudo-code
if (!uow.IsComplete) {
uow.Rollback();
}
}
因此,如果发生异常 - 即使没有使用显式的try-catch块,事务也将被回滚。如果您没有明确提交,也会发生同样的情况。