SQL Server中的嵌套SQL事务

3

我有两个存储过程,我从一个存储过程中调用另一个存储过程,并且在这两个存储过程中都使用了事务。下面是这两个存储过程:

CREATE PROCEDURE [dbo].[spOuter]    
AS
BEGIN
    begin tran t1
    -- some sql queries..
    Exec spInner;

    commit tran t1
END


CREATE PROCEDURE [dbo].[spInner] 
AS
BEGIN

    begin tran t2
    – some sql queries.
    rollback tran t2

END

但是在执行时,它显示如下错误:

无法回滚t2。找不到该名称的任何事务或保存点。

有人可以解释为什么会出现这种情况吗?


你正在调用“spInsertInner”,但存储过程的名称是“spInner”。你能给我们实际的代码吗? - Charles
@Charles 对不起,我搞错了,我已经更正了。 - user3166407
2
如果您在内部存储过程中回滚,因此回滚内部事务,则会回滚所有事务。因此,当您从内部存储过程返回时,没有可提交的事务了。 SQL Server仅“伪造”嵌套事务-它们并不像您所期望的那样真正起作用-有关更多信息,请参见Paul Randal的SQL Server神话:嵌套事务是实际存在的(http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/)。 - marc_s
@marc_s,即使我在spInner的rollback tran中避免使用事务名称,它也不起作用。请问您能告诉我如何重写存储过程吗? - user3166407
1
读一下我链接的那篇文章吧!不,SQL Server中的嵌套事务并不能像人们期望的那样工作 - 语法是存在的,但功能并不支持。 - marc_s
1个回答

1

有没有任何想法可以重写这个SPS? - user3166407
1
SQL Server不支持像Oracle或DB2那样的嵌套事务。因此,您的内部回滚将无法起作用,最终会留下一个未提交的事务,因此在执行此外部过程后,您的数据库将不处于一致状态。无论发生什么情况,您都应该提交内部事务,并仅在外部过程中编写其他内容...嵌套事务这是您面临的真正问题。 - Vinu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接