![SSMS - 对同一张表同时执行两个 ALTER 表语句](https://linux22.com/image/1634765/SSMS%20-%20%E5%AF%B9%E5%90%8C%E4%B8%80%E5%BC%A0%E8%A1%A8%E5%90%8C%E6%97%B6%E6%89%A7%E8%A1%8C%E4%B8%A4%E4%B8%AA%20ALTER%20%E8%A1%A8%E8%AF%AD%E5%8F%A5.png)
对同一张表执行两个 ALTER 表脚本是否存在已知问题?两个脚本都会更改表中同一列(但不同)的数据类型?
我想知道一个脚本完成并提交对表所做的更改是否会导致另一个脚本出现问题。显然,最好创建一个脚本来同时更改两列的数据类型,但系统的设计并非如此。
答案1
我引用了 Kalen Delaney 所著的《SQL Server 并发》第 3 章:高级锁定概念一书中关于用于架构更新的锁类型的内容:
Sch-M:架构修改锁
SQL Server 在执行某些更改表定义(其架构)的 DDL 操作时会获取 Sch-M 锁。这些操作包括在表中添加和删除列,或更改列的数据类型。Sch-M 锁是兼容性最差的锁模式,所有其他模式的请求都会被 Sch-M 锁阻止,反之亦然;如果任何其他会话对该表拥有任何其他锁,则该会话无法获得 Sch-M 锁。换句话说,当一个会话对表进行架构更改时,其他任何会话都无法对该表执行任何操作。
这意味着两个脚本不能并行执行:其中一个脚本将首先锁定表,因此第二个脚本将等待表上的架构修改锁被释放。因此,这两个脚本是串行执行的,并且两个脚本都将相继成功。
虽然正确,但这意味着在两个脚本的持续期间该表无法进行更新或查询,因此将其锁定在所有其他操作上的时间加倍。