[英]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
他们做什么?
outerProc
开始交易(@@ TRANCOUNT = 1) innerProc
(proc开头= 1的@@ TRANCOUNT) innerProc
开始另一笔交易(@@ TRANCOUNT = 2) innerProc
回滚事务(@@ TRANCOUNT = 0) 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.