SQLServer之创建隐式事务

隐式事务创建注意事项

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

示例结果:依次显示事务执行结果和查询事务执行结果。

 

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐