全局变量@@translate 跟踪事务当前状况。Adaptive Server 通过跟踪 在语句执行之后发生的所有事务更改来确定要返回的状态。
0 事务正在进行。事务有效;已成功执行了前一语句。
1 事务已经成功。事务已完成且已提交其更改。
2 语句已中止。前一语句已中止;对事务无影响。
3 事务已中止。事务已中止且已回退任何更改。
以下两个例子
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 不成功之后 (由于规则冲突)和事务回退之后检查 @@transtate: begin 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 语句并取消该事务。