BEGIN TRAN //事务1 insert update COMMIT select 1 BEGIN TRAN //事务2 insert COMMIT select 2
看来真是奇怪了:create table tb(id int) go create trigger t on tb for insert as print @@TRANCOUNT go begin tran print @@TRANCOUNT insert into tb values(1) commit traninsert into tb values(1)go drop table tb/*--结果居然为: 1(所影响的行数为 1 行)1(所影响的行数为 1 行)1--*/
--这么说你可能明白一点: --环境: create table xx (a int) go create trigger t_xx_in for insert as insert yy values(...) go--语句:insert xx values(1)--实际在sqlserver中是: begin tran insert xx values(1) insert yy values(...) <<<====它们是一个事务。 commit tran
--建立环境create table xx (a int) gocreate trigger t_xx_in on xx for insert as print @@trancount go-------------- insert test values (1)结果是 1 说明sqlserver启动了一个隐式事务 ------------------------ begin tran print @@trancount insert test values (1) commit 结果是 1 1 说明sqlserver启动了一个显示事务 ---------------------- begin tran begin tran print @@trancount insert test values (1) commit commit结果是 2 2 说明sqlserver启动了两个显示事务
--建立环境 create table test(a int) gocreate trigger xx on test for insert as print @@trancount begin tran print @@trancount commit tran go--------------------------- insert test values (1) 结果是 1 2 第一个1说明sqlserver启动一个隐式事务 第二个2说明在触发器内部启动了一个显示事务
insert
update
COMMIT
select 1
BEGIN TRAN //事务2
insert
COMMIT
select 2
go
create trigger t on tb
for insert
as
print @@TRANCOUNT
go
begin tran
print @@TRANCOUNT
insert into tb values(1)
commit traninsert into tb values(1)go
drop table tb/*--结果居然为:
1(所影响的行数为 1 行)1(所影响的行数为 1 行)1--*/
---------------------------------------> sorry,写错了。因该是:
T-SQL语言会对不在事务之中的insert、update、delete命令
--环境:
create table xx (a int)
go
create trigger t_xx_in
for insert
as
insert yy values(...)
go--语句:insert xx values(1)--实际在sqlserver中是:
begin tran
insert xx values(1)
insert yy values(...) <<<====它们是一个事务。
commit tran
gocreate trigger t_xx_in on xx
for insert
as
print @@trancount
go--------------
insert test values (1)结果是
1
说明sqlserver启动了一个隐式事务
------------------------
begin tran
print @@trancount
insert test values (1)
commit
结果是
1
1
说明sqlserver启动了一个显示事务
----------------------
begin tran
begin tran
print @@trancount
insert test values (1)
commit
commit结果是
2
2
说明sqlserver启动了两个显示事务
create table test(a int)
gocreate trigger xx on test for insert
as
print @@trancount
begin tran
print @@trancount
commit tran
go---------------------------
insert test values (1)
结果是
1
2
第一个1说明sqlserver启动一个隐式事务
第二个2说明在触发器内部启动了一个显示事务
re:
你说单独一个insert语句有事务吗?
有
它是一个隐式事务
触发器自身也在事务中,那我如何判断这个事务是触发器外部,还是触发器内部的事务呢?
re:
触发器没有起用单独事务。