欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQLServer之创建隐式事务

程序员文章站 2023-11-08 08:34:52
隐式事务创建注意事项 IMPLICIT_TRANSACTIONS为 ON 时,系统处于“隐式”事务模式。 这意味着如果 @@TRANCOUNT = 0,下列任一 Transact-SQL 语句都会开始新事务。 这等同于先执行一个不可见的 BEGIN TRANSACTION。 IMPLICIT_TRA ......

隐式事务创建注意事项

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

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

SQLServer之创建隐式事务

SQLServer之创建隐式事务