В чем разница между транзакцией SQL на уровне хранимой процедуры и транзакцией на уровне SqlConnection?

скажем, хранимая процедура на сервере MSSQL использует транзакцию SQL, используя BEGIN TRANSACTION/COMMIT TRANSACTION, Как это отличается от начала и фиксации с помощью ADO.NET via SqlConnection.BeginTransaction()?

2 ответов


для ADO.NET это не имеет значения. Это неявно указано в MSDN, где для объекта SqlTransaction метод Commit называется " fail, если транзакция уже была откатана на сервере."

кроме того, SQL Server Profiler показывает "установить уровень изоляции транзакций Read COMMITTED; BEGIN TRAN", как только вы выполняете .BeginTransaction на связи.

для ADO (не .NET), однако, это не так. Это используется, чтобы позволить хорошие сценарии с, эффективно, вложенными транзакции (серверные trans были вложены внутри клиентских). Несмотря на то, что я использовал это много, я не могу точно определить, что такое "клиентская транзакция" в этом случае.


Если вы собираетесь вызвать несколько хранимых proc подряд, и вы хотите иметь возможность отката, то вы должны управлять транзакцией из кода с помощью SqlConnection.BeginTransaction(). В остальном то же самое.