13

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

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

它是如何工作的?

回答

9

基本上,当你的TransactionScope设置为隐C#中,它调用SQL Server的SET命令来使IMPLICIT_TRANSACTIONS模式的连接。您所做的任何事情(使用第二个链接中列出的命令之一)会启动一个保持开放的事务,直到发出提交为。如果在连接结束时没有发出提交,则执行隐式ROLLBACK。

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

+0

如果你明确地使用`BEGIN TRANSACTION ...',那么在'implicit_transactions off`模式下说事务是显式的是正确的,否则这被称为* autocommit *模式。 – jlb 2017-01-09 00:03:09

5

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

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

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

+0

Thanks.I知道,当我们执行一个INSERT statment它隐transaction.You执行说,隐性交易将启动每个commit.consider后,我们有2个保护 - 咨询热点中的TransactionScope是第二statment将抛出exception.when第一statment 1完成它提交和新的事务将创建。你说这个?但是为什么当第二个事务抛出异常时,整个事务将在TransactionScope中回滚? – Arian 2011-02-13 20:42:49

+1

@Kerezo否,一旦事务被提交,自上次提交以来,所有的语句将被锁定到数据库中。所以如果任何语句抛出一个异常,唯一的损失将是在最后一次提交之后执行的语句数 – zzlalani 2013-11-25 17:23:32

2

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

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

在显式事务中,如果发生错误,我们可以回滚到隐式事务中不能完成的事务的开始。

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 Reference Source中的SqlInternalTransaction.ExecuteTransactionYukon

相关问题