隐式事务创建注意事项
implicit_transactions为 on 时,系统处于“隐式”事务模式。 这意味着如果 @@trancount = 0,下列任一 transact-sql 语句都会开始新事务。 这等同于先执行一个不可见的 begin transaction。
implicit_transactions为 off 时,上述每个 t-sql 语句都受一个不可见的 begin transaction 和一个不可见的 commit transaction 语句限制。为 off 时,事务模式为自动提交。 如果 t-sql 代码发出了一个可见 begin transaction,那么事务模式为显式。
有几点需要说明:
-
事务模式为隐式时,如果 @@trancount > 0,则不会发出不可见的 begin transaction。 但是,任何显式 begin transaction 语句都会递增 @@trancount。
-
insert 语句和工作单元中的其他任务完成后,须发出 commit transaction 语句,直到 @@trancount 递减为 0。 也可以发出一个 rollback transaction。
-
不会从表中选择的 select 语句不会启动隐式事务。 例如,
select getdate();
或select 1, 'abc';
不需要事务。 -
由于 ansi 默认值的原因,可能会意外打开隐式事务。 有关详细信息,请参阅 set ansi_defaults (transact-sql).
implicit_transactions on 不常用。 大多数情况下,implicit_transactions 为 on,是因为选择了 set ansi_defaults on。
-
进行连接时, sql server native client ole db provider for sql server 和 sql server native client odbc 驱动程序会自动将 implicit_transactions 设置为 off。 对于与 sqlclient 托管提供程序进行连接,及通过 http 端点接收的 soap 请求,set implicit_transactions 默认为 off。
使用t-sql脚本创建隐式事务
语法:
–声明数据库引用
use 数据库名称;
go
–设置隐式事务开关
set implicit_transactions { on | off };
–事务业务逻辑
事务操作内容;
–查看是否有事务开启
select @@trancount;
–必须提交或者回滚事务
{ commit | rollback } { tran | transaction};
语法解析:
–set implicit_transactions { on | off };
–为 on 时,系统处于“隐式”事务模式。 这意味着如果 @@trancount = 0
–为 off 时,上述每个 t-sql 语句都受一个不可见的 begin transaction 和一个不可见的 commit transaction 语句限制。 为 off 时,事务模式为自动提交。
–用@@trancount来测试是否已经打开一个事务.
—select @@trancount结果是1,意思是当前连接已经打开了一个事务。0的意思是当前没有事务,一个大于1的数的意思是有嵌套事务。
–@@trancount的值是1,这个时候必须提交或者回滚事务,不然等到会话结束,表仍然是锁住,会造成阻塞。
–{ commit | rollback } { tran | transaction};
–commit { tran | transaction} 提交事务。
–rollback { tran | transaction} 回滚事务。
示例:
–声明数据库引用
use testss;
go
–查看implicit_transactions状态
–declare @implicit_transactions varchar(10)=’off’;
–if((2&@@options)=2) set @implicit_transactions=’on’;
–select @implicit_transactions as implicit_transactions;
–设置隐式事务状态打开
set implicit_transactions on;
go
–开启一个隐式事务
insert into test1(name,sex,age,height) values(‘测试隐式事务’,’女’,’20’,’180′);
–判断是否有隐式事务开启,如果有则提交,没有则回滚
if (select @@trancount) is not null and (select @@trancount)=1
commit tran;
else
rollback transaction;
go
示例结果:依次显示事务执行结果和查询事务执行结果。