隐式事务创建注意事项
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