在执行请求期间启动了多少事务?
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
没有分号 ;
是危险的,因为下一个单词可以解释为交易名称。错误的事务名称意味着什么都不会发生。这就是为什么你应该 总是 用分号终止语句。
我有一笔交易。密码是
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();
orSELECT 1, 'ABC';
do not require transactions.
如下:
- 您打开
implicit_transactions
,这意味着命令打开 并保持打开 事务,它们不会自动提交。 select getdate()
不 打开交易,因为没有引用 tablebegin transaction
开启交易begin transaction
递增@@trancount
到 2select * from
不做任何改变,通常会打开一个交易rollback
滚动 一切 返回delete from
打开但不提交事务。select 100860
什么都不做commit
提交drop table price
打开并离开挂起交易
如果 implicit_transactions
关闭会发生什么情况? 答案是 还有三个事务 ,除了显式事务外都已提交回滚
select getdate()
什么都不做。begin transaction
打开但不提交事务。begin transaction
递增@@trancount
到 2select * from
没有改变rollback
滚动 一切 返回delete from
打开并提交事务。select 100860
什么都不做。commit
什么都不做drop table price
打开并提交事务。
请注意: rollback transaction
没有分号 ;
是危险的,因为下一个单词可以解释为交易名称。错误的事务名称意味着什么都不会发生。这就是为什么你应该 总是 用分号终止语句。