У меня есть существующее приложение, которое использует много вызовов 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 to 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)
? Или есть еще одна возможность связать два бита кода вместе?
Follow Up Вопрос
Спасибо @ программирования-героя, что действительно полезно, то, что я теперь не уверен в том, когда я должен закрыть SQL соединения? Код внутри методов DAL делает проверку, чтобы проверить, была ли она передана транзакция, если она есть, затем она использует соединение в этой транзакции и не закрывает соединение после его завершения, если транзакция не передается, а затем новый соединение открыто и закрыто для работы. Если я закрою SqlConnection внутри TransactionScope, это вызовет проблему для внешней транзакции? Я спрашиваю, потому что, если я закрываю SqlConnection, у которого есть объект SqlTransaction, транзакция откатывается.
Согласен. Одно из предостережений - «TransactionScope» будет эскалироваться в распределенную транзакцию (которая является PITA для развертывания), если весь код доступа к данным не имеет единого открытого объекта соединения. –