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

问题描述

我有一笔交易。代码

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 个事务?

解决方法

答案都不是。

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

编辑:原始版本对select getdate

有误

Quote from the docs: 不从表中选择的 SELECT 语句不会启动隐式事务。例如 SELECT GETDATE();SELECT 1,'ABC'; 不需要交易。


如下:

  • 您打开 implicit_transactions,这意味着命令打开并保持打开事务,它们不会自动提交。
  • select getdate() 不会打开一个事务,因为没有引用任何表
  • 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 没有分号 ; 是危险的,因为下一个词可以解释为交易名称。不正确的交易名称意味着什么也没有发生。这就是为什么你应该总是用分号结束语句。