可序列化隔离级别对 DDL 语句有什么影响?

And*_*ren 3 sql-server-2008 sql-server ddl isolation-level

我正在使用 Red Gate SQL Compare 根据 SVN 和数据库之间的差异创建发布脚本。这导致脚本包含一堆表和过程更改,并且工作正常。然而,有一件事让我感到困惑,它使用了可序列化的事务隔离级别。

我知道它对 dml 语句的作用,但我不确定它对 ddl 意味着什么。有人可以启发我,也许举个例子吗?

Pau*_*ite 5

我知道它对 dml 语句的作用,但我不确定它对 ddl 意味着什么。

一般来说,不多。

DDL 包含大量的操作(其中许多有自己的特殊行为),但大多数 DDL 将Sch-M在底层对象上采取模式修改 ( ) 锁,无论是在命令期间还是在关键阶段(例如在大多数在线索引构建结束)。这是限制性最强的锁类型,可在任何隔离级别防止任何类型的并发访问。

即使Sch-M没有采取措施,引擎也会在适当的时候小心地采取正确的锁定措施,以确保最终结果是正确的。例如,不可能建立一个不能准确反映基础数据的索引。

无论用户指定的任何会话隔离级别如何,上述所有内容都适用。


就元数据的更改(即像 等视图底层的系统结构sys.tables)而言,虽然 SQL Server 自动确保正确更改,但仅完全支持用户访问,并保证在默认锁定READ COMMITTED隔离级别下得到尊重。

引用元数据访问、隔离级别和锁定提示(强调):

SQL Server 不保证在通过目录视图、兼容性视图、信息架构视图、元数据发射内置函数访问元数据的查询中会遵守锁定提示。

在内部,SQL Server 数据库引擎仅遵守READ COMMITTED元数据访问的隔离级别。例如,如果事务具有隔离级别,SERIALIZABLE并且在事务内尝试使用目录视图或元数据发射内置函数访问元数据,则这些查询将一直运行,直到它们以READ COMMITTED. 但是,在快照隔离下,由于并发 DDL 操作,对元数据的访问可能会失败。这是因为元数据没有版本化。因此,在快照隔离下访问以下内容可能会失败:

  • 目录视图
  • 兼容性视图
  • 信息架构视图
  • 元数据发射内置函数
  • sp_help 一组存储过程
  • SQL Server Native Client 目录过程
  • 动态管理视图和功能

从同一页面:

下表提供了各种隔离级别下的元数据访问摘要。

元数据访问的隔离级别支持

尽管没有得到保证或支持,但在READ UNCOMMITTED隔离下访问元数据(例如目录视图、DMV)以避免阻塞问题可能很重要。大多数工具和诊断脚本大量使用READ UNCOMMITTED隔离(通常使用同义但名称误导的NOLOCK提示)。有关示例,请参阅Glenn Berry 的诊断查询

作为尊重READ UNCOMMITTED访问的示例,请参阅元数据函数应遵循与连接和不良习惯上的元数据查询相同的隔离语义:使用Aaron Bertrand 的(某些)元数据“助手”函数

甚至不尊重以高于已提交读的隔离访问元数据- 信息将使用READ COMMITTED隔离语义读取。


如果我不得不猜测,我会说问题中的比较工具将隔离设置SERIALIZABLE为覆盖生成的脚本中的任何 DML。