sql - 我们可以跳过回滚到特定表并在 SQL 事务中回滚其他表吗
问题描述
我有一个类似于下面的存储过程
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
我的要求是,如果发生任何问题,则应调用 catch 回滚。并且这种回滚应该只发生在 Employee2、Employee3、Employee4 跳过 Employee1 表上。
最后,我将只在 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
推荐阅读
- r - 创建一个函数来执行计算并将答案作为列添加到现有数据框
- node.js - 覆盖 eslint-plugin-mocha 规则上的错误消息
- python - Python 包 cx_Oracle==5.1.3 需要 Microsoft Visual C++ 9.0
- android - 只有安全或非 null 断言的 kotlin 消息
- jinja2 - 用于将 jinja2 模板与渲染输出进行比较以确保合规性的工具?
- c# - C# 创建防火墙规则以允许系统响应 ping?
- fiware-orion - Orion 的实体插入越来越慢
- tensorflow - 如何使用 tensorflow sess 更改 Cleverhans 'test_imagenet_attacks.py'?
- python - 如何提示用户输入文件位置、搜索特定文件并提示用户是否要移动文件
- javascript - 创建新对象时的对象解构