rei*_*den 6 sql-server triggers isolation-level
我一直在寻找明确的有关隔离级别的文档(或并发或范围......我不知道到底该怎么称呼它)在SQL Server中的触发器.
我找到了以下来源,表明我认为是真的(也就是说两个用户,对同一个表执行更新 - 即使是相同的行 - 将会执行独立且隔离的触发器):
第一个问题基本上是我试图找到答案的同一个问题,但给出的答案并未提供任何来源.第二个问题也接近标记,答案是相同的,但同样没有提供任何来源.
有人能指出我可用文档做出相同断言的地方吗?
谢谢!
Sol*_*zky 10
那么,隔离级别和范围是两个非常不同的东西.
隔离级别
触发器在事务中运行.默认情况下,该事务应使用默认的隔离级别READ COMMITTED.但是,如果调用进程指定了不同的隔离级别,那么将覆盖默认值.按照惯例:如果需要,您应该能够在触发器内覆盖它.
根据DML触发器的MSDN页面:
触发器和触发它的语句被视为单个事务,可以从触发器中回滚.如果检测到严重错误(例如,磁盘空间不足),整个事务将自动回滚.
范围
提供的上下文是:
{来自你}
两个用户,对同一个表执行更新 - 即使是相同的行
{来自问题中第一个链接的MSDN文章"基本上是我试图找到答案的同一个问题"}
插入和删除的表是否作用于当前会话?换句话说,它们只包含当前范围的插入和删除记录,还是包含针对同一个表的所有当前更新操作的记录?甚至可以真正并发操作或锁定会阻止这种情况吗?
在进入inserted和deleted表之前,应该非常清楚,在任何给定时刻,在特定行上只会发生一次DML操作.两个或多个请求可能以完全相同的纳秒进入,但所有请求将轮流,一次一个(是的,由于锁定).
现在,关于inserted和deleted表中的内容:是的,只有那个特定事件的行(甚至可以是)在这两个伪表中.如果执行将修改5行的UPDATE,则只有那5行将在inserted和deleted表中.由于您正在查找文档,因此使用inserted和deleted表的MSDN页面指出:
已删除的表在DELETE和UPDATE语句期间存储受影响行的副本.在执行DELETE或UPDATE语句期间,将从触发器表中删除行并将其传送到已删除的表.删除的表和触发器表通常没有共同的行.
inserted表在INSERT和UPDATE语句期间存储受影响行的副本.在插入或更新事务期间,新行将添加到插入的表和触发器表中.插入表中的行是触发器表中新行的副本.
将此问题与问题的其他部分联系起来,与事务隔离级别相关的部分:事务隔离级别对inserted和deleted表格完全没有影响,因为它们专门针对该事件/查询.但是,如果使用隔离级别或表提示,那么在其他进程中仍然可以看到在这两个伪表中捕获的该操作的净效果.READ UNCOMMITTEDNOLOCK
只是为了澄清一些事情,上面关于inserted和deleted表连接的MSDN页面在一开始就表明它们"在内存中"但这并不完全正确.从SQL Server 2005开始,这两个伪表实际上是基于tempdb.tempdb数据库的MSDN页面指出:
在tempdb的系统数据库是一个全球性的资源,可用于连接到SQL Server实例的所有用户和用于保存下列:
...
由功能的数据修改事务生成的行版本,例如:联机索引操作,多活动结果集(MARS)和AFTER触发器.
在SQL Server 2005之前,从事务日志中读取inserted和deleted表(我相信).
总结一下,inserted和deleted表:
| 归档时间: |
|
| 查看次数: |
2991 次 |
| 最近记录: |