SQL Server中的嵌套SQL事务

SQL Server中的嵌套SQL事务,sql,sql-server,transactions,rollback,Sql,Sql Server,Transactions,Rollback,我有两个存储过程,我从另一个存储过程调用一个存储过程,在这两个存储过程中我都使用事务。下面是存储过程 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

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

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对不起,我的错误,我已经更正了。如果您回滚内部存储过程,从而回滚内部事务,那么所有事务都将回滚。因此,当您从内部存储过程返回时,就没有更多的事务要提交了。SQL Server仅“伪造”嵌套事务—它们并不像您预期的那样真正工作—获取更多信息info@marc_s因此,即使我在spInner中的rollback tran中避免使用事务名称,它也不会起作用。那么,您能告诉我如何重写存储过程吗?请阅读我链接的那篇文章!不,SQL Server中的嵌套事务确实不能像人们所期望的那样工作-语法在那里,但功能不在那里。你知道如何重写sps吗?SQL Server不支持oracle或db2之类的嵌套事务。因此,内部回滚永远不会工作,它将在最后留下一个未限制的事务,因此在执行此外部过程后,数据库将不会处于一致状态。无论发生什么,您都应该提交内部事务,并且只在外部进程中编写其他内容。。。这是你面临的真正问题。