我有一个使用了大量SqlTranaction调用现有的应用程序。该应用程序的构建方式,我们得到了一堆代码,看起来有点像这样(为简便起见错误处理等去掉):我应该如何将SqlTransaction遗留代码与TranactionScope集成?
Using transaction As SqlTransaction = Database.CreateSqlTransaction()
If Not Me.FitnessSession.FitnessTestSessionID.HasValue Then
Me.FitnessSession.Insert(transaction)
Else
Me.FitnessSession.Update(transaction)
End If
SaveTestScores(transaction)
Database.CommitTransaction(transaction) 'This essentially just calls transaction.Commit()
End Using
我们在开沟出手卷DAL和移动到LINQ的过程到SQL,但这将是增量式的,因为我们没有预算来简单地丢弃所有我们的遗留代码。因此,我们将在我们需要使用我们的旧代码和Linq到SQL代码的所有领域都处于同一事务中。我相信这可以这样做:
Using scope As New TransactionScope()
Using transaction As SqlTransaction = Database.CreateSqlTransaction()
If Not Me.FitnessSession.FitnessTestSessionID.HasValue Then
Me.FitnessSession.Insert(transaction)
Else
Me.FitnessSession.Update(transaction)
End If
SaveTestScores(transaction)
Database.CommitTransaction(transaction)
End Using
End Using
什么我就被其承诺称不清楚,我必须打电话scope.Complete()
或Database.CommitTransaction(transaction)
?或者还有其他一些选项将两段代码链接在一起?
跟进质询,
感谢@编程英雄那是真正有用的,什么我现在不能确定的是,我的时候应该关闭SQL连接?该DAL方法中的代码使一个检查,看是否已经通过了一项交易,如果有,那么它使用对事务的连接并没有关闭连接,一旦完成后,如果没有交易过那么新连接打开并关闭操作。如果我关闭了TransactionScope中的SqlConnection,这是否会导致环境事务出现问题?我问,因为如果关闭具有SqlTransaction对象的SqlConnection,事务将回滚。
我同意。一个警告 - 'TransactionScope'将升级到一个分布式事务(这是一个用于部署的PITA),除非所有数据访问代码共享一个打开的连接对象。 – 2010-01-04 17:45:27