繁体   English   中英

带有事务的嵌套过程

[英]Nested procedures with transactions

我有以下问题。 我要存储过程(调试消息是双重提示):

CREATE PROC innerProc
AS 
BEGIN
        SELECT 'innerProc 1',@@TRANCOUNT
    BEGIN TRAN
        SELECT 'innerProc 2',@@TRANCOUNT
    ROLLBACK
        SELECT 'innerProc 3',@@TRANCOUNT
END

GO  -----------------------------------------

CREATE PROC outerProc
AS 
BEGIN
        SELECT 'outerProc 1',@@TRANCOUNT
    BEGIN TRAN
        SELECT 'outerProc 2',@@TRANCOUNT
    EXEC innerProc
        SELECT 'outerProc 3',@@TRANCOUNT
    ROLLBACK
        SELECT 'outerProc 4',@@TRANCOUNT
END

GO  -----------------------------------------

EXEC outerProc

他们做什么?

  1. outerProc开始交易(@@ TRANCOUNT = 1)
  2. 执行innerProc (proc开头= 1的@@ TRANCOUNT)
  3. innerProc开始另一笔交易(@@ TRANCOUNT = 2)
  4. innerProc回滚事务(@@ TRANCOUNT = 0)
  5. 问题就这里innerProc开头的@@ TRANCOUNT与结尾处的@@ TRANCOUNT不相等。 我究竟做错了什么? 这是正确的方法吗?

我相信您需要使用命名的事务,否则,当您回滚嵌套的事务时,即使所有范围仅限于内部存储过程,您都将杀死所有事务。

http://msdn.microsoft.com/en-us/library/ms188929.aspx

进一步阅读: http : //msdn.microsoft.com/en-us/library/ms181299.aspx

没有savepoint_name或transaction_name的ROLLBACK TRANSACTION将回滚到事务的开始。 嵌套事务时,该同一语句会将所有内部事务回滚到最外面的BEGIN TRANSACTION语句。 在这两种情况下,ROLLBACK TRANSACTION都会将@@ TRANCOUNT系统功能减为0。ROLLBACKTRANSACTION savepoint_name不会减少@@ TRANCOUNT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM