【发布时间】:2016-10-18 19:45:34
【问题描述】:
我正在尝试在 SQL Server 2008 过程中实现自主事务。该过程将仅包含两个嵌套事务,InnerTransaction 将在其上提交,而OuterTransaction 将回滚。
我已经看到很多成功实现逆向过程的例子。但我还没有找到任何解决我的问题的方法。
示例表脚本
create table testTab1(id int identity(1,1) primary key, name varchar(100));
create table testTab2(id int , name varchar(100));
insert into testTab1(name) values('User1'),('User2'),('User3');
过程示例代码
CREATE PROCEDURE [dbo].[testSP2]
AS
BEGIN
SET IMPLICIT_TRANSACTIONS ON
BEGIN TRAN
insert into testTab1(name) values('User4'),('User5'),('User6');
IF @@ROWCOUNT>0
BEGIN
SAVE TRAN InnerTran
insert into testTab2(id,name) values(1,'User4'),(2,'User5'),(3,'User6');
--PRINT 'NUMBER OF TRAN='+CAST(@@TRANCOUNT AS VARCHAR(5))
COMMIT TRAN InnerTran
END
ROLLBACK
SET IMPLICIT_TRANSACTIONS OFF
END
我想要的输出是
【问题讨论】:
-
简单地说......你不能。嵌套事务是一个神话。他们甚至没有接近你认为他们应该做的。第二个事务仅增加@@TRANCOUNT 的值,并且回滚或提交将计数设置为 0,并对每个“嵌套”事务执行回滚/提交。 sqlskills.com/blogs/paul/…
-
@SeanLange 感谢您的评论,我只是想确定我们是否可以在 Sql 服务器中执行此操作或不使用
nested transaction。但我认为现在我必须采用另一种方法来做到这一点。你能建议任何黑客吗? -
这没有“黑客”。看看你的代码。除非您违反约束,否则从逻辑上讲永远不可能进入您的内部事务。你真的想在这里做什么?也许就像在插入到 testTab2 中使用 NOT EXISTS 一样简单?对要求的一些解释将使这更容易。
-
正如我之前所说,没有办法做到这一点。时期。故事结局。但真正的问题是你实际上想做什么,因为你很可能只需要换个角度思考它。也许您需要使用 TRY/CATCH。然后,如果您的插入失败,您可以使用 catch 插入其他地方。
-
我只是在观察并等待微软为我们提供自主事务功能,这就是我在这篇 SO 帖子中发现自己的方式。我可能每月调查一次。
标签: sql-server database sql-server-2008 tsql transactions