问题描述
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
没有分号 ;
是危险的,因为下一个词可以解释为交易名称。不正确的交易名称意味着什么也没有发生。这就是为什么你应该总是用分号结束语句。