如果您不回滚交易,是否还会进行更改?


10

说我正在运行查询

begin tran

update users
set name = 'Jimmy'
where name = 'john'

如果我回滚该事务,是否仍会进行这些更改,会引发错误还是仍然会回滚?


我猜这取决于您用来运行这些语句或嵌入它们的应用程序的客户端软件的行为。如果配置了某些选项,它们可能会自动提交(默认情况下,SSMS会执行此操作)。
mustaccio

3
明确声明的事务不会自动提交。由于Josh宣布交易开始,因此其行为将与Justin Cave的回答完全相同。
戴夫

Answers:


16

您必须了解什么是交易 -它是一个工作单元。它是ALL或NOTHING(遵循ACID属性),并且可以保证数据库的一致性。

如果我不回滚交易,这些更改是否仍会进行

仅当您提交时,才会进行更改。SQL Server将所有更改记录到事务日志中,一旦您提交,它们将被加固到数据文件中。

如果您不提交,则您的事务将无限期保持OPEN状态-您可以在中sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactions使用或使用DBCC OPENTRAN

同样,您启动的是一个显式事务,该事务应以COMMIT或ROLLBACK语句显式结束。

另请阅读- 始终创建事务是否不明智?


@JoshStevenson我认为阅读数据库上下文中的Atomic Operations值得一读。
Nelz

12

如果您既不提交也不回滚该事务,则该事务将无限期地继续存在。它会继续保持其锁,可能会阻塞其他会话,直到您通过a commit或a 结束事务,rollback或者直到DBA退出并杀死了该会话为止(或者直到诸如网络故障之类的问题导致连接失败为止)。如果DBA终止了会话,则他们将隐式为此事务和任何其他未清事务发出回滚。


这是正确的答案。没有这些信息,对于COMMIT和ROLLBACK语句一起使用,对我来说毫无意义。
Tarec

1

除非除非提交了交易,否则否则不会进行更改,上面提到的全部或全部不回答,

原子性是其背后的原因,您可以检查ACID事务属性,它是数据库系统遵循的基本属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.