SQL Server 触发器隔离/范围文档

2024-03-17

我一直在寻找确定的有关 SQL Server 中触发器的隔离级别(或并发性或范围...我不确定确切的称呼它)的文档。

我发现以下来源表明我认为是正确的(也就是说,两个用户对同一个表(甚至是相同的行)执行更新,然后将执行独立且隔离的触发器):

  • https://social.msdn.microsoft.com/Forums/sqlserver/en-US/601977fb-306c-4888-a72b-3fbab6af0cdc/effects-of-concurrent-trigger-firing-on-inserted-and-deleted-tables?论坛=transactsql https://social.msdn.microsoft.com/Forums/sqlserver/en-US/601977fb-306c-4888-a72b-3fbab6af0cdc/effects-of-concurrent-trigger-firing-on-inserted-and-deleted-tables?forum=transactsql

  • https://social.msdn.microsoft.com/forums/sqlserver/en-US/b78c3e7b-6b98-48e1-ad43-3c773c79a6ff/trigger-and-inserted-table https://social.msdn.microsoft.com/forums/sqlserver/en-US/b78c3e7b-6b98-48e1-ad43-3c773c79a6ff/trigger-and-inserted-table

第一个问题本质上与我试图找到答案的问题相同,但给出的答案没有提供任何来源。第二个问题也很切中要害,答案是一样的,但同样没有提供来源。

有人可以指出我可用的文档在哪里做出了相同的断言吗?

Thanks!


嗯,隔离级别和范围是两个截然不同的东西。

隔离级别
触发器在事务内运行。默认情况下,该事务应使用默认隔离级别READ COMMITTED。但是,如果调用进程指定了不同的隔离级别,那么这将覆盖默认值。像往常一样:如果需要,您应该能够在触发器本身内覆盖它。

根据 MSDN 页面DML 触发器 https://msdn.microsoft.com/en-us/library/ms178110.aspx:

触发器和触发它的语句被视为单个事务,可以从触发器内回滚。如果检测到严重错误(例如磁盘空间不足),整个事务将自动回滚。

Scope
提供的上下文是:

{来自你}

两个用户,对同一个表执行更新——甚至是相同的行

{来自问题中第一篇链接的 MSDN 文章,“本质上是我试图找到答案的同一个问题”}

插入和删除的表的范围是否仅限于当前会话?换句话说,它们将仅包含当前范围内插入和删除的记录,还是包含针对同一表的所有当前更新操作的记录?是否可以存在真正的并发操作,或者锁会阻止这种情况发生吗?

在进入之前inserted and deleted应该非常清楚地表明,在任何给定时刻,特定行上只会发生单个 DML 操作。两个或多个请求可能会在完全相同的纳秒内到来,但所有请求都会轮流进行,一次一个(是的,由于锁定)。

现在,关于inserted and deleted表:是的,只有该特定事件的行(甚至canbe) 在这两个伪表中。如果执行将修改 5 行的 UPDATE,则只有这 5 行将位于inserted and deleted表。由于您正在寻找文档,MSDN 页面使用插入和删除的表 https://msdn.microsoft.com/en-us/library/ms191300.aspx states:

已删除表存储 DELETE 和 UPDATE 语句期间受影响行的副本。在执行 DELETE 或 UPDATE 语句期间,行将从触发器表中删除并传输到已删除表。已删除表和触发器表通常没有公共行。

插入的表存储 INSERT 和 UPDATE 语句期间受影响的行的副本。在插入或更新事务期间,新行将添加到插入表和触发器表中。插入表中的行是触发器表中新行的副本。

将其与问题的另一部分联系起来,即与事务隔离级别相关的部分:事务隔离级别对inserted and deleted表,因为它们专门与该事件/查询相关。然而,在这两个伪表中捕获的该操作的净效果仍然可以是visible到其他进程,如果它们正在使用READ UNCOMMITTED隔离级别或NOLOCK表提示。

只是为了澄清一些事情,上面链接的 MSDN 页面有关inserted and deleted表一开始就声明它们“在内存中”,但这并不完全正确。从 SQL Server 2005 开始,这两个伪表实际上基于tempdb。 MSDN 页面临时数据库 https://msdn.microsoft.com/en-us/library/ms190768.aspx states:

The tempdb系统数据库是一种全局资源,可供连接到 SQL Server 实例的所有用户使用,并用于保存以下内容:

  • ...

  • 由数据修改事务为功能生成的行版本,例如:在线索引操作、多个活动结果集 (MARS) 和 AFTER 触发器。

在 SQL Server 2005 之前,inserted and deleted表是从事务日志中读取的(我相信)。


总而言之,inserted and deleted tables:

  • 在交易中操作
  • 是静态(即只读)表
  • 仅对当前触发器可见
  • 仅包含触发该触发器实例的特定事件/操作/查询的行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 触发器隔离/范围文档 的相关文章

随机推荐

  • 如何将spark-submit的整个输出重定向到文件

    因此 我尝试将 apache Spark submit 命令的输出重定向到文本文件 但某些输出无法填充文件 这是我正在使用的命令 spark submit something py gt results txt 我可以在终端中看到输出 但在
  • Jacoco 报告称,在 Android 项目中,单元测试对 Kotlin 类的覆盖率为 0

    我正在使用 Android Gradle 插件 3 0 0 我正在将 Android 应用程序从 java 迁移到 kotlin 我的应用程序有 Java 和 Kotlin 中的类 并且测试是用 Java 编写的 I run gradlew
  • 重新调整一个因素

    给定一个无序因子 ID 每个级别的排名的参考向量以及每个级别的标签 现在我想按给定的排名对 ID 进行排序 然后我想覆盖因子中的标签 如果有更好的方法 您能否提供建议 ID lt factor c 1 2 2 3 1 3 3 2 1 1 1
  • gitignore 按文件大小?

    我正在尝试实现 Git 来管理创意资产 Photoshop Illustrator Maya 等 并且我想根据文件大小而不是扩展名 位置等从 Git 中排除文件 例如 我不想排除所有 avi 文件 但随机目录中有一些我不想提交的大量 1GB
  • 将搜索栏添加到 WordPress 的导航菜单中

    http www lundarienpress com http www lundarienpress com 这是一个 WordPress 网站 这是我的网站 我正在尝试将搜索栏添加到导航菜单并将其放在右侧 有任何想法吗 我还没有找到办法
  • 如何使用 Xcode 4.3.2 打开 objectVersion 38 的 Xcode 项目

    我有一个 Xcode 项目MyProject pbproj其中一个项目文件project pbxproj拥有财产objectVersion 38 当我尝试使用 Xcode 打开它时 我收到消息 无法加载 处的项目 项目版本不兼容 我的Xco
  • 如何将操作链接包含到按钮的标签中?

    我的目标是在标签中包含一个操作链接 显示帮助文本 selectInput button library shiny ui lt fluidPage br selectInput inputId some id label Please ch
  • 自更新到 Swift 1.2 以来,字典现在给出错误“无法转换为 BooleanLiteralConvertible”

    我刚刚开始了解 Swift 然后出现了 Swift 1 2 破坏了我的工作代码 我有一个基于代码示例的函数NSHipster CGImageSourceCreateThumbnailAtIndex http nshipster com im
  • 使用 XSLT 更改 XML 文件中的一个标签名称

    我是否可以在 XSLT 中设置条件 以便仅查找并替换特定标记名称的第一个标记 例如 我有一个 XML 文件 其中包含许多内容
  • 使用 php artisanserve 无法加载公共文件夹中的任何 js / css?

    我有xampp控制面板v3 2 2 php版本5 6 24 我的laravel版本是5 4 32 在 Windows 7 32 位中 我正在使用 Laravel 创建项目composer create project laravel lar
  • 是否使用JTA事务?

    我正在开发一个部署在 JBoss 应用程序服务器上的 J2EE 应用程序 该应用程序由 EJB 2 x 组件和 Web 组件组成 运行在本地计算机或远程服务器上 数据库是 Oracle 或 SQL Server 并且不处于分布式环境中 我使
  • 通过 Istio 入口网关的 TLS 握手失败 (tlsMode=passthrough)

    从外部客户端到 Kubernetes 集群内服务器的 TLS 握手失败 这是关于理解原因 我已将 Istio 入口网关配置为通过端口 15433 上收到的 TLS 并将其路由到端口 433 上的服务器 入口网关日志显示客户端尝试 TLS 握
  • 在 VSTS 中执行运行功能测试任务时出错

    在 VSTS 2015 中 我们在使用 NUnit 测试框架的项目中构建和发布管道设置 我们正在尝试使用 运行功能任务 配置集成测试用例执行 任务配置如下面的屏幕截图所示 可视化测试代理部署任务用于在目标计算机中部署 NUnit 测试代理
  • 每 5 秒使用 jquery/javascript 读取 XML

    我有一个html 索引 html Tasks span 0 span Messages span 0 span Notifications span 0 span
  • Spring Rest 客户端异常处理

    我正在使用弹簧RestTemplate消耗休息服务 在春季休息中暴露 我能够消费成功场景 但对于负面情况 服务会返回错误消息和错误代码 我需要在我的网页中显示这些错误消息 例如对于无效请求 服务抛出异常HttpStatus BAD REQU
  • 如何根据 X509Certificate2Collection 链验证 X509Certificate2

    我正在编写一个 SAML 2 0 响应解析器来处理 ASP Net 中的 POST 身份验证 在 C 和 MVC 中 但这不太相关 所以我有一个 p7b要验证的文件并且可以读入X509Certificate2Collection以及示例断言
  • 像any.do一样弹出窗口

    我正在编写一个应用程序 在弹出窗口中显示未接来电和未读短信 它还具有提醒功能 关闭弹出窗口并在指定时间后打开它 它类似于any do的弹出窗口 我能够使用 WindowManger 创建这样一个窗口 但由于某些我到目前为止不明白的原因 弹出
  • 如何在 ClickOnce 安装中仅更新一个 DLL?

    我正在开发一个大型单击一次应用程序 150MB gt 200 个 DLL 作为交互式调试过程的一部分 我想仅更新 1 个 DLL 并重新启动应用程序 而无需重建和重新部署整个应用程序 那可能吗 如果是这样 怎么办 问题澄清 2009年9月2
  • ImageButton标题标签

    在 ImageButton 上使用 AlternateText 属性向浏览器呈现 alt 标签
  • SQL Server 触发器隔离/范围文档

    我一直在寻找确定的有关 SQL Server 中触发器的隔离级别 或并发性或范围 我不确定确切的称呼它 的文档 我发现以下来源表明我认为是正确的 也就是说 两个用户对同一个表 甚至是相同的行 执行更新 然后将执行独立且隔离的触发器 http