隐式事务和显式事务的区别

21

隐式事务和显式事务在SQL Server 2008中有何区别?

TransactionScope的背景中发生了什么?我正在使用TransactionScope,但在SQL Server分析器中看不到“Begin transaction...”语句。

它是如何工作的?

4个回答

15

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

这与OFF设置不同,后者也将每个语句放入一个事务 - 不同之处在于在OFF模式下(因此事务是显式的),每个事务(单个语句)立即提交。


如果你 (显式地) 使用 BEGIN TRANSACTION ...,那么在 implicit_transactions off 模式下,可以说交易是明确的,否则则称为 autocommit 模式。 - jlb

5
在显式事务模式下,您需要显式地开始一个事务。在隐式事务模式下,每次提交后会自动启动一个事务。因此,您只需提交即可。
由于事务是“隐式”启动的,因此您将在日志中看不到明确的“BEGIN”。 :)
默认情况下,数据库以启用自动提交的显式事务模式运行。这实际上意味着,除非使用BEGIN TRANSACTION显式开始事务,否则每个数据修改都将在单独的事务中启动,并在语句之后提交。这允许数据库在失败时回滚整个语句(例如,批量插入或修改触发器中其他数据的插入)。

谢谢。我知道当我们执行单个INSERT语句时,它会在隐式事务中执行。您说隐式事务将在每次提交后开始。考虑我们在TransactionScope中有2个语句,第二个语句会抛出异常。当第一个语句完成并提交后,新的事务将创建。您是这样说的吗?但是为什么当第二个事务抛出异常时,整个事务都会在TransactionScope中回滚? - Arian
1
@Kerezo 不,一旦事务提交,自上次提交以来的所有语句都将被锁定到数据库中。因此,如果任何语句抛出异常,唯一的损失将是在最后提交之后执行的语句数量。 - zzlalani

3

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

显式事务具有事务的开始、结束和回滚命令:Begin Transaction,Commit Transaction和Rollback Transaction。

在显式事务中,如果在其中发生错误,我们可以回滚到事务的开头,这在隐式事务中是不可能的。


7
隐式事务和自动提交是两种不同的概念。当你将 IMPLICIT_TRANSACTIONS 设置为 ON 时,下一个 DML 命令会开始一个新的事务。这些更改会一直挂起,直到你使用 COMMIT 或 ROLLBACK 提交或回滚它们。如果你在没有发出 COMMIT 命令的情况下断开连接,则它会自动回滚。如果你使用 IMPLICIT_TRANSACTIONS OFF 发送 DML 命令并且没有待定的显式事务,就会发生自动提交 - 在执行完 DML 命令之后,在处理下一个命令之前,数据会被自动提交。我从未使用过隐式事务。 - Mike Dimmick

0

SqlTransaction - 在TransactionScope内部使用的事务,仅对SQL Server 2000及更早版本发送T-SQL BEGIN TRANSACTION命令。

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

请参阅TDS协议文档中的Transaction Manager Request,Profiler文档中的TM: Begin Tran Starting Event Class以及.NET Reference Source中的SqlInternalTransaction.ExecuteTransactionYukon


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接