没有存储过程的嵌套事务怎么办?

How do do a nested transaction without stored procedure?

我试图在不使用存储过程的情况下编写嵌套事务。它的结构是什么。我试过了,但出现了一些错误。我的一些变量没有出现,当我尝试声明它们时,它说它们已经被声明了。

Begin Transaction campOffer
    Begin Transaction loyaltyCard
        Begin Transaction marketingList
            Insert Into marketing_list values (@custID, @name, @dOB,  
  @gender, @parish, @mobile, @mProvider, @mStatus)
            Select @@TRANCOUNT

            Commit Transaction
        End

        Insert Into Loyalty_Card (Member_ID) Values (@memID)
        Select @@TRANCOUNT

        Commit Transaction
    End

    Insert Into Campaign_Offer values (@offID, @offDate, @custID, @offValue, @prodName, @accepStatus, @empID)
    Select @@TRANCOUNT

    Commit Transaction
End

嵌套事务是一个神话。行。你可以拥有它们。但是 SQL 服务器只认为最外层的交易是真实的。你不能回滚一个内部的。它将回滚最外层的事务。有关更多详细信息,请参阅 COMMIT and ROLLBACK 语句的 MSDN 一般备注部分。

您在理解 BEGIN TRANSACTION 时遇到了一个小问题。这不是像 BEGIN 本身那样的块语句。因此,一旦您声明了一个变量,它的作用域就不会离开 COMMIT 或 ROLLBACK 语句。

Begin Transaction campOffer --@@TRANCOUNT = 1
Begin Transaction loyaltyCard --@@TRANCOUNT = 2
Begin Transaction marketingList --@@TRANCOUNT = 3
Insert Into marketing_list values (@custID, @name, @dOB, @gender,
    @parish, @mobile, @mProvider, @mStatus)
Select @@TRANCOUNT

Commit Transaction --@@TRANCOUNT = 2
--END -- does not correspond to any BEGIN statement

Insert Into Loyalty_Card (Member_ID) Values (@memID)
Select @@TRANCOUNT

Commit Transaction --@@TRANCOUNT = 1
-- END -- does not correspond to any BEGIN statement

Insert Into Campaign_Offer values (@offID, @offDate, @custID, @offValue, @prodName, @accepStatus, @empID)
Select @@TRANCOUNT

Commit Transaction --@@TRANCOUNT = 0... outer transaction is now committed.
--END -- does not correspond to any BEGIN statement

--在存储过程之外,您必须声明并设置所有参数的值。

    declare @custID as int, @name as varchar(10), @dOB as date,@gender as varchar(1) 
    --.... (do this for all with appropriate data types)

    -- then set the desired values.
    Set @custID = 101;
        Set @name = 'johnny';
        --(Set all param values)


    Begin Transaction campOffer
    Begin Transaction loyaltyCard
        Begin Transaction marketingList
            Insert Into marketing_list values (@custID, @name, @dOB,  
                                                @gender, @parish, @mobile, @mProvider, @mStatus)
            Select @@TRANCOUNT

            Commit Transaction
        End

        Insert Into Loyalty_Card (Member_ID) Values (@memID)
        Select @@TRANCOUNT

        Commit Transaction
    End

    Insert Into Campaign_Offer values (@offID, @offDate, @custID, @offValue, @prodName, @accepStatus, @empID)
    Select @@TRANCOUNT

    Commit Transaction
End