Sybase 事务和嵌套事务

全局变量@@translate 跟踪事务当前状况。Adaptive Server 通过跟踪 在语句执行之后发生的所有事务更改来确定要返回的状态。

事务正在进行。事务有效;已成功执行了前一语句。

image

事务已经成功。事务已完成且已提交其更改。

image

语句已中止。前一语句已中止;对事务无影响。

image

事务已中止。事务已中止且已回退任何更改。

image

以下两个例子

begin transaction
insert into publishers (pub_id) values ("9999") (1 row affected)
select @@transtate
----------
0

(1 row affected)
commit transaction select @@transtate
----------
1

(1 row affected)

以下示例在 insert 不成功之后 (由于规则冲突)和事务回退之后检查
@@transtatebegin transaction
insert into publishers (pub_id) values ("7777")
Msg 552, Level 16, State 1:
A column insert or update conflicts with a rule bound to the column.The command is aborted.The conflict occured in database ’pubs2’, table ’publishers’, rule ’pub_idrule’, column ’pub_id’.
select @@transtate
----------
2

(1 row affected)
rollback transaction select @@transtate
----------
3

(1 row affected)
Adaptive Server 只有在响应事务采取的操作时才会更改 @@transtate。 语法和编译错误不会影响 @@transtate 的值。

嵌套事务

可以在其它事务中嵌套事务。当嵌套 begin transaction 和 commit transaction 语句时,实际上由最外层对语句开始并提交事务。内部的语句对只跟踪 嵌套级别。Adaptive Server 直到发出与最外层 begin transaction 相匹配的 commit transaction 时才提交此事务。通常,当包含 begin commit 语句对的 存储过程或触发器相互调用时,才发生这种事务 “嵌套”。

@@trancount 全局变量可跟踪事务的当前嵌套级别。 begin transaction 最 初隐式或显式地将 @@trancount 设置为 1。每个后续 begin transaction 将

@@trancount 递增,而 commit transaction 将其递减。触发一个触发器也 将使 @@trancount 递增,并且可用一个可以触发触发器的语句来开始事 务。除非 @@trancount 等于 0,否则不会提交嵌套事务。

例如,以下嵌套语句组直到最后的 commit transaction,才由 Adaptive Server 提交该事务:

begin tran

    select @@trancount

    /* @@trancount = 1 */ 
    begin tran

    select @@trancount

    /* @@trancount = 2 */ 
        begin tran

        select @@trancount

        /* @@trancount = 3 */ 
         commit tran

     commit tran 
commit tran

select @@trancount

/* @@ trancount = 0 */                

如果在嵌套 rollback transaction 语句时不包括事务名或保存点名,则将回 退到最外层的 begin transaction 语句并取消该事务。

原文地址:https://www.cnblogs.com/xiaohengheng/p/6566016.html