在SQL事务中,我们可以跳过回滚到特定表并回滚其他表吗
我有一个类似于下面的存储过程在SQL事务中,我们可以跳过回滚到特定表并回滚其他表吗,sql,sql-server,Sql,Sql Server,我有一个类似于下面的存储过程 CREATE PROC Usp_InsertData(@ID INT, @Name varchar(max)) AS BEGIN TRY BEGIN TRANSACTION INSERT INTO Employee1(ID,[Name]) VALUES(@ID,@Name); INSERT INTO Employee2(ID,[Name]) VALUES(@ID,@Name); INSERT INTO Emplo
CREATE PROC Usp_InsertData(@ID INT, @Name varchar(max))
AS
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO Employee1(ID,[Name]) VALUES(@ID,@Name);
INSERT INTO Employee2(ID,[Name]) VALUES(@ID,@Name);
INSERT INTO Employee3(ID,[Name]) VALUES(@ID,@Name);
INSERT INTO Employee4(ID,[Name]) VALUES(@ID,@Name);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
我的要求是,如果出现任何问题,那么应该调用in-catch回滚。此回滚应仅在跳过Employee1表的Employee2、Employee3、Employee4上发生
最后,我将只在Employee1和其他回滚中实现数据
有没有办法从事务回滚中跳过特定的表
更新1:
我从主SP调用上面的SP,如下所示。因此,即使主SP事务失败,所有更改都需要回滚,Employee1除外
CREATE PROC Usp_MasterInsertData(@ID INT,@Name varchar(max))
AS
BEGIN TRY
BEGIN TRANSACTION
EXEC Usp_InsertData @ID,@Name --In this SP, I want to skip rollback to Employee1 table.
EXEC Usp_UpdateData @ID,@Name
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
在第一次插入后添加事务,如
CREATE PROC Usp_InsertData(@ID INT, @Name varchar(max))
AS
INSERT INTO Employee1(ID,[Name]) VALUES(@ID,@Name);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO Employee2(ID,[Name]) VALUES(@ID,@Name);
INSERT INTO Employee3(ID,[Name]) VALUES(@ID,@Name);
INSERT INTO Employee4(ID,[Name]) VALUES(@ID,@Name);
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
为什么有4个不同的员工表?!?我只是把它们作为例子。请把所有的表看作不同的表。把第一个插入项从事务中取出怎么样?您可以在第一次插入后使用
SAVE TRANSACTION
生成保存点,然后回滚到该点。一般来说,它的用途非常有限,但在这种特定情况下,它可能有一些应用。在你使用它之前要意识到它;从客户端代码进行显式事务处理通常要好得多。将其拆分为两个事务。在一个表中插入第一个表。然后插入其他的。