隐式和显式交易的区别

时间:2011-02-13 20:30:59

标签: sql-server-2005 sql-server-2008 c#-4.0 transactions transactionscope

Sql Server 2008中的隐式和显式事务有什么区别?

在TransactionScope背景中会发生什么?我正在使用TransactionScope但在Sql server profiler中我没有看到“Begin transaction ...”语句。

它是如何运作的?

4 个答案:

答案 0 :(得分:11)

基本上,在c#中将TransactionScope设置为Implicit时,它会调用SQL Server SET命令将连接置于IMPLICIT_TRANSACTIONS模式。您执行的任何操作(使用第二个链接中列出的命令之一)都会启动一个保持打开的事务,直到发出提交。如果在连接结束时未发出提交,则执行隐式ROLLBACK。

这与OFF设置不同,OFF设置也将每个语句放入一个事务中 - 区别在于OFF模式(因此事务是显式的),每个事务(单数语句)立即提交

答案 1 :(得分:5)

在显式事务模式下,您需要显式启动事务。在隐式事务模式中,每次提交后都会自动启动事务。所以你只需要提交。

由于事务是“隐式”启动的,因此您不会在日志中看到明确的“BEGIN”。 :)

默认情况下,数据库以显式事务模式运行,并启用自动提交事务。实际上,除非使用BEGIN TRANSACTION启动显式事务,否则每个数据修改都在一个单独的事务中启动,该事务在语句之后提交。这允许数据库在失败时回滚整个语句(例如批量插入或修改触发器中其他数据的插入)。

答案 2 :(得分:2)

隐式事务是自动提交。交易没有开始或结束。

显式事务具有命令的事务的开始,结束和回滚 开始事务,提交事务和回滚事务。

在显式事务中,如果在两者之间发生错误,我们可以回滚到事务的开头,这在隐式事务中是无法完成的。

答案 3 :(得分:0)

SqlTransaction - TransactionScope在封面下使用 - 仅为SQL Server 2000及更早版本发送T-SQL BEGIN TRANSACTION命令。

对于SQL Server 2005及更高版本,TDS协议已扩展为允许客户端直接操作事务而不发送BEGIN TRANSACTION等。要在Profiler中查看这些内容,请选择“TM:Begin Tran starting”事件等您可能需要选中“显示所有事件”复选框以查看这些事件 - 它们位于“交易”类别下。

请参阅TDS协议文档中的Transaction Manager Request,Profiler文档中的TM: Begin Tran Starting Event Class和.NET参考源中的SqlInternalTransaction.ExecuteTransactionYukon