2014-01-09 57 views
3

我有两个存储过程,我从另一个存储过程调用一个存储过程,并在两个存储过程中使用事务。下面是存储过程,如下图所示SQL Server中的嵌套SQL事务

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 

但在执行这个时候,它显示错误:

Cannot roll back t2. No transaction or savepoint of that name was found.

任何人都可以解释为什么它显示?

+0

你打电话 “spInsertInner”,但PROC被命名为 “微调”。你有没有给我们实际的代码? – Charles

+0

@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 /)获取更多信息 –

回答

1
+0

有什么想法如何重写sps? – user3166407

+1

SQL Server不支持像oracle或db2这样的嵌套事务。因此,您的内部回滚将无法工作,最终会导致未完成的事务,因此在执行此外部过程后,您的数据库将不会处于一致状态。 你应该提交内部事务,不论发生什么事,谱写只外PROC其他的东西...... [嵌套事务(http://technet.microsoft.com/en-us/library/ ms189336(v = sql.105).aspx) 这是您正面临的真正问题。 – Vinu