在执行请求期间启动了多少事务?

How many transactions were started during the execution of the request?

我有一笔交易。密码是

set implicit_transactions on
select getdate()
begin transaction
begin transaction
   select * from price p1, product p2 where p1.product_id = p2.product_id
rollback
   delete from PRODUCT where product_id = 100871
   select 100860,2,3,getdate(),null from PRODUCT
commit
drop table price

问题是在请求执行期间启动了多少事务?据我了解,有些人将此称为“嵌套事务”,尽管这不是官方术语。

那么,从服务器的角度来看,是启动了 2 个事务,还是 1 个?

答案都不是。

是三个:一个回滚,一个提交,最后一个挂起。

EDIT: Original version was wrong about select getdate

Quote from the docs: SELECT statements that do not select from a table do not start implicit transactions. For example SELECT GETDATE(); or SELECT 1, 'ABC'; do not require transactions.


如下:

  • 您打开 implicit_transactions,这意味着命令打开 并保持打开 事务,它们不会自动提交。
  • select getdate() 打开交易,因为没有引用 table
  • begin transaction 开启交易
  • begin transaction 递增 @@trancount 到 2
  • select * from 不做任何改变,通常会打开一个交易
  • rollback 滚动 一切 返回
  • delete from 打开但不提交事务。
  • select 100860什么都不做
  • commit 提交
  • drop table price 打开并离开挂起交易

如果 implicit_transactions 关闭会发生什么情况? 答案是 还有三个事务 ,除了显式事务外都已提交回滚

  • select getdate() 什么都不做。
  • begin transaction 打开但不提交事务。
  • begin transaction 递增 @@trancount 到 2
  • select * from 没有改变
  • rollback 滚动 一切 返回
  • delete from 打开并提交事务。
  • select 100860 什么都不做。
  • commit 什么都不做
  • drop table price 打开并提交事务。

请注意: rollback transaction 没有分号 ; 是危险的,因为下一个单词可以解释为交易名称。错误的事务名称意味着什么都不会发生。这就是为什么你应该 总是 用分号终止语句。