Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer2008中实现自治事务?_Sql Server_Database_Sql Server 2008_Tsql_Transactions - Fatal编程技术网

Sql server 如何在SQLServer2008中实现自治事务?

Sql server 如何在SQLServer2008中实现自治事务?,sql-server,database,sql-server-2008,tsql,transactions,Sql Server,Database,Sql Server 2008,Tsql,Transactions,我正在尝试在SQLServer2008过程中实现自治事务。该过程将有两个嵌套的事务,其中InnerTransaction将提交,而OuterTransaction将回滚。 我看过很多成功实现反向过程的例子。但是我还没有找到解决我问题的办法 示例表脚本 create table testTab1(id int identity(1,1) primary key, name varchar(100)); create table testTab2(id int , name varchar(100)

我正在尝试在SQLServer2008过程中实现自治事务。该过程将有两个嵌套的事务,其中
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
我期望的输出是


为了公正起见,有一个链接的环回服务器解决方案来模拟SQL server上的自主事务:


另一个博客写得很好,展示了模仿Oracle出色的自主交易功能的每一个“黑客”。我期待着在SQL Server中出现这种功能


注意:出于某种原因,当你向SQL Server的员工提出这个问题时,他们会看着你,好像你疯了一样,并开始问“你为什么需要它……为什么有人需要它?”。现在我在一家SQL Server商店里,我得到了很多。只要知道如果你来自甲骨文。。。该数据库具有强大而深入的功能,例如内置的很棒的搜索算法,以及出色的字符串解析和操作功能,您在深入SQL Server后会发现它缺少这些功能。别误会我。。。SQLServer在很多方面都做得很好,比如表变量和临时表,以及将T-SQL与普通SQL正确混合的能力。Oracle将PL-SQL与SQL引擎分开,这是Oracle的一个主要缺点。正反两面。

简单地说……你不能。嵌套事务是一个神话。他们甚至没有接近你认为他们应该达到的程度。第二个事务仅增加@@TRANCOUNT的值,回滚或提交将计数设置为0,并对每个“嵌套”事务执行回滚/提交@SeanLange感谢您的评论,我只想确定我们是否可以在Sql server中执行此操作,或者不使用
嵌套事务
。但我认为现在我必须采取另一种方法来做到这一点。你能推荐一些黑客吗?这个没有“黑客”。看看你的代码。从逻辑上讲,除非您违反了约束,否则不可能访问您的内部事务。你到底想在这里干什么?也许像使用insert to testTab2一样简单?对需求的一些解释会使这变得容易得多。正如我前面所说的,没有办法做到这一点。时期故事结束了。但真正的问题是你到底想做什么,因为你很可能只需要换一种方式来思考。也许你需要使用TRY/CATCH。然后,如果你的插入失败,你可以使用catch在其他地方插入。我只是在观察并等待微软给我们提供自主交易功能,这就是我在这篇文章中发现自己的原因。我可能每个月调查一次。