Sql Server 多层嵌套事务的执行结果

news/2025/9/20 11:45:51/文章来源:https://www.cnblogs.com/Seamless/p/19102219

数据库事务处理的核心概念:在标准的事务模型中,嵌套的内部事务的“提交”在外层事务失败时是无效的。所有操作,包括内部事务的操作,都将被回滚。

核心概念:真正的“嵌套事务” vs. “保存点”

首先要澄清一个关键点:大多数主流关系型数据库(如 Oracle, PostgreSQL, SQL Server)并不真正支持所谓的“嵌套事务”。它们使用的是 保存点 来模拟嵌套事务的行为。

  1. 真正的嵌套事务

    • 这是一个理论模型,内部事务可以独立于外部事务提交或回滚。

    • 如果内部事务提交,它的结果将立即持久化,即使外部事务后续回滚,内部事务的结果也会保留。

    • 这种模型非常复杂,且在实际应用中较少见。一些对象数据库或特定的应用框架可能支持。

  2. 使用保存点模拟的嵌套事务(现实中的情况)

    • 这是绝大多数数据库的实现方式。

    • 当一个“内部事务”启动时(例如,在SQL Server中执行 BEGIN TRAN nested_tran),数据库并不会创建一个新的事务,而是在当前事务中创建一个名为保存点的标记。

    • 所谓的“内部事务提交”实际上只是释放或清除这个保存点,并没有真正地将数据持久化到磁盘。

    • 真正的提交只有一个,那就是最外层的 COMMIT 操作。只有这个操作才能将数据永久写入数据库。

    • 如果外层事务回滚(ROLLBACK),无论你是否创建了保存点或“提交”了内部事务,整个事务范围内的所有修改都将被撤销。

举个例子(以 SQL Server 为例)

BEGIN TRANSACTION OuterTran; -- 开始最外层事务SAVE TRANSACTION InnerTran1; -- 创建一个保存点(模拟开始内部事务)
-- 执行一些SQL操作(INSERT, UPDATE...)
-- ...
-- 假设这里“提交”内部事务,实际上只是操作完成,没有错误。
-- 但数据并没有真正提交,只是保存在OuterTran事务中。SAVE TRANSACTION InnerTran2; -- 创建另一个保存点
-- 执行更多操作...
-- ...
-- 再次“提交”内部事务-- 现在假设在外部事务结束前发生了错误
ROLLBACK TRANSACTION OuterTran; -- 回滚最外层事务

 

结果会怎样?
所有在 OuterTran 事务中进行的操作,包括在 InnerTran1 和 InnerTran2 保存点之后所做的操作,全部都会被撤销。数据库将恢复到执行 BEGIN TRANSACTION OuterTran 之前的状态。

特殊情况:自治事务

有一种例外情况可以实现内部事务的真正提交,即自治事务。

  • 自治事务 是一个独立的事务,它从调用它的父事务中独立出来。

  • 即使在自治事务中提交,它的操作会立即持久化,不受父事务最终是提交还是回滚的影响。

  • Oracle 和 PostgreSQL(通过过程语言扩展)明确支持自治事务。

Oracle 自治事务示例:

CREATE OR REPLACE PROCEDURE My_Autonomous_Proc ISPRAGMA AUTONOMOUS_TRANSACTION; -- 关键声明:这是一个自治事务
BEGININSERT INTO my_table VALUES (1, 'Data');COMMIT; -- 这个提交是真实且立即生效的
END;
/BEGIN -- 外层主事务-- 调用自治事务
    My_Autonomous_Proc;-- ... 执行一些其他操作,然后失败了RAISE SOME_ERROR; -- 引发一个错误COMMIT;
EXCEPTIONWHEN OTHERS THENROLLBACK; -- 回滚外层事务
END;
/

结果会怎样?
尽管外层事务被回滚了,但自治事务 My_Autonomous_Proc 中的 INSERT 操作已经被提交,会永久保留在数据库中。


总结

 
场景内部事务结果常见数据库
标准“嵌套事务”(实为保存点) 全部回滚。内部事务的“提交”只是假象,最终依赖外层事务的提交。 SQL Server, MySQL (InnoDB), PostgreSQL, Oracle
真正的自治事务 提交有效。内部事务已独立提交,结果持久化,不受外层事务结果影响。 Oracle, PostgreSQL (通过扩展)

因此,在你的问题描述中,除非嵌套的内部事务被明确声明为自治事务,否则当最外层事务失败回滚时,所有内部操作都将被撤销,数据库保持一致状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:数据库入门实战版

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

es入门

es的概念 Es,全称ElasticSearch,是一个开源的分布式搜索引擎,底层基于 Lucene 实现。 es和传统db数据库的对应关系传统Db ElasticSearch数据库(database) 索引(index)表(tables) 类型(types)行(rows) 文档(documents…

YOLO进阶提升 1YOLOv2 改进

进阶提升 1YOLOv2 改进 核心概念YOLOv2:YOLO 的第二代版本,重点提升检测精度,同时保持实时速度。 Darknet-19:YOLOv2 使用的主干网络,由 19 层卷积层组成,借鉴 VGG 小卷积核设计。 Anchor Boxes(先验框):通过…

C# Avalonia 15- Animation- AnimationPlayerTest

C# Avalonia 15- Animation- AnimationPlayerTest自己实现一个AnimationPlayer类 AnimationPlayer类public partial class AnimationPlayer : ObservableObject{private readonly DispatcherTimer timer;private DateT…

Windows电脑快捷键

Windows电脑快捷键tab 用于切换菜单,以及在编写文本时空四个格子 功能键shift 控制键Ctrl win键 用于打开菜单 组合ctrl+shift=切换输入法 ctrl+shift+esc=打开任务管理器 alt+fn+f4=撤销当前窗口 Ctrl+C=复制 ctrl+S…

基于Python+Vue开发的体育场馆预约管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

JSONArray集合根据某个字段查询对象

JSONArray list = new JSONArray(); JSONObject json1 = new JSONObject(); json1.put("code","10086"); json1.put("name","张三"); list.add(json1); JSONObject json2 = n…

详细介绍:Parasoft C/C++test 针对嵌入式开发的内存错误检测解决方案

详细介绍:Parasoft C/C++test 针对嵌入式开发的内存错误检测解决方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

[WC2006] 水管局长

显然,这道题需要维护一棵最小生成树,支持动态删边,查询链上最大值。查询链上最大值可以倍增维护,但是本题 \(n\) 较小,直接暴力往上跳也是可过的。 接下来就是如何动态维护最小生成树的问题了。对于一般图的最小生…

02-Media-7-uvc.py 应用软件解码的USB摄像头(UVC)捕获视频并显示的程序

02-Media-7-uvc.py 应用软件解码的USB摄像头(UVC)捕获视频并显示的程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

YOLO入门理解 3YOLOv1 思路与细节

入门理解 YOLOv1 思路与细节 核心概念YOLOv1:第一个提出端到端单阶段目标检测的模型,将检测任务转化为回归问题。 网格划分 (SS):输入图像被划分为固定网格,每个网格负责预测落在其中心的物体。 候选框 (Bounding…

完整教程:Qt开发经验 --- qmake执行系统命令(15)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

YOLO入门理解 评估指标

入门理解 评估指标 核心概念IoU(Intersection over Union):预测框与真实框的交并比,用来衡量检测结果是否准确。 Precision(精度):正确预测为正例的比例(TP / (TP + FP))。 Recall(召回率 / 查全率):实际…

清除win+r“运行”对话框中的历史记录

方法一:通过“文件夹选项”清除 按下 Win + R键打开“运行”对话框。 输入 control folders后回车,打开“文件夹选项”(Win 10+版本为“文件资源管理器选项”)。在“常规”选项卡下,找到“隐私”部分。 点击“清除…

[ICPC 2024 Yokohama R] Peculiar Protocol

我们约定:\(f_{l,r}\) 表示 \([l,r]\) 最多可以进行的操作次数(不一定要全部消掉)。 \(s_{l,r}\) 表示 \([l,r]\) 的 \(a\) 的和。考虑 \(f\) 应该怎么求解,根据区间 DP 的套路我们枚举中间点: \[f_{i,j}=\max\li…

YOLO入门理解 基础概念

核心概念YOLO(You Only Look Once):一种基于单阶段(one-stage)的目标检测框架,直接通过 CNN 回归得到检测框框与类别,特点是速度快、适合实时检测。 One-Stage 与 Two-Stage 检测:One-Stage:直接通过网络输出…

The 2025 ICPC Asia East Continent Online Contest (II)(C,D,E,H,I)

C. Jiaxun! C思路 首先来了解一下 \(Hall\) 定理,对于二分图 \(G<X+Y, M>\) ( \(X\) 表示左边点集,\(Y\) 表示右边点集,\(M\) 表示边集),令 \(W\) 表示 \(X\) 的子集, \(N(W)\) 表示 \(W\) 邻居的点集,则…

深入解析:不同上位开发语言、PLC下位平台、工业协议与操作系统平台下的数据类型通用性与差异性详解

深入解析:不同上位开发语言、PLC下位平台、工业协议与操作系统平台下的数据类型通用性与差异性详解2025-09-20 11:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal …

2022年十大Web黑客技术提名开启

本文宣布2022年十大Web黑客技术提名正式开始,旨在收集社区对最具创新性和可复用性的Web安全研究技术的提名,涵盖HTTP请求走私、缓存投毒、WAF绕过等前沿攻击手法。2022年十大Web黑客技术 - 提名开启 James Kettle 研…

13. LangChain4j + 加入检索增加生成 RAG(知识库) - Rainbow

13. LangChain4j + 加入检索增加生成 RAG(知识库) @目录13. LangChain4j + 加入检索增加生成 RAG(知识库)RAG 的概念LangChain4j RAG 的使用理论LangChain4j RAG 的实战最后: RAG 的概念官网:https://docs.langchain…