我正在使用 Red Gate SQL Compare 根据 SVN 和数据库之间的差异创建发布脚本。这导致脚本包含一堆表和过程更改并且工作正常。然而,有一件事让我感到困惑,它使用事务隔离级别可序列化。
我知道它对 dml 语句有什么作用,但我不确定它对 ddl 意味着什么。有人可以启发我,也许举个例子吗?
我正在使用 Red Gate SQL Compare 根据 SVN 和数据库之间的差异创建发布脚本。这导致脚本包含一堆表和过程更改并且工作正常。然而,有一件事让我感到困惑,它使用事务隔离级别可序列化。
我知道它对 dml 语句有什么作用,但我不确定它对 ddl 意味着什么。有人可以启发我,也许举个例子吗?
一般来说,不多。
DDL 包含范围广泛的操作(其中许多具有自己的特殊行为),但大多数 DDL 将
Sch-M
在命令持续期间或关键阶段(例如在大多数在线索引构建的结束)。这是限制性最强的锁类型,可防止在任何隔离级别进行任何类型的并发访问。即使
Sch-M
没有被锁定,引擎也会在适当的时候小心地锁定正确的锁,以确保最终结果是正确的。例如,不可能建立一个不能准确反映底层数据的索引。无论用户指定的任何会话隔离级别如何,以上所有内容均适用。
就元数据的更改(即像 之类的视图下的系统结构
sys.tables
)而言,虽然 SQL Server 会自动确保正确更改,但用户访问仅在默认锁定READ COMMITTED
隔离级别得到完全支持和保证。引用元数据访问、隔离级别和锁定提示(强调):
从同一页面:
尽管没有得到保证或支持,但在隔离状态下访问元数据(例如目录视图、DMV)
READ UNCOMMITTED
以避免阻塞问题可能很重要。大多数工具和诊断脚本都大量使用READ UNCOMMITTED
隔离(通常使用同义但名称误导的NOLOCK
提示)。有关示例,请参阅Glenn Berry 的诊断查询。作为不
READ UNCOMMITTED
接受访问的示例,请参阅Aaron Bertrand 撰写的元数据函数应遵循与元数据查询相同的隔离语义和坏习惯:使用(某些)元数据“帮助程序”函数。以高于读取提交的隔离访问元数据甚至不被尊重——信息将以
READ COMMITTED
隔离语义读取。如果非要我猜的话,我会说问题中的比较工具将隔离设置
SERIALIZABLE
为覆盖生成的脚本中的任何 DML。我相信它对 DDL 的意义与对 DML 的意义相同。关于该主题的msdn 文章实际上在该部分下为您提供了一个非常清晰的概念
SERIALIZABLE
:基本上只要你的事务在运行,就不能对你直接或间接引用的任何对象执行任何 DDL。