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