3961: Snapshot isolation transaction failed because the object was modified by a DDL statement(快照隔离事务失败,因为对象已被 DDL 语句修改)
SQL Server含义
在快照隔离级别下运行的事务失败,因为它访问的对象被另一个并发事务中的 DDL 语句(架构更改)修改。元数据没有版本控制,因此快照事务无法继续。
原因
在以 SNAPSHOT 隔离级别(SET TRANSACTION ISOLATION LEVEL SNAPSHOT)启动的事务运行期间,另一个会话对其访问的表执行了 ALTER TABLE/CREATE INDEX 等 DDL。快照事务可以看到行版本,但看不到架构版本。在 READ COMMITTED SNAPSHOT(RCSI)下不会出现此错误;RCSI 为每条语句获取新的快照。
解决方法
重试事务;DDL 完成后通常会成功。作为永久方案,在没有大量快照负载的维护窗口内执行架构更改(DDL)。在应用中捕获此错误并实现自动重试逻辑。缩短长时间运行的快照事务。
同一数据库的其他条目
- 3902The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION(COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION)
- 1101Could not allocate a new page because of insufficient disk space in filegroup(文件组磁盘空间不足,无法分配新页)
- 3729Cannot DROP because it is being referenced by object(无法 DROP,因为它正被对象引用)
- 1785Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths(引入 FOREIGN KEY 约束可能导致循环或多重级联路径)
- 9421XML parsing: illegal xml character(XML 解析:非法 XML 字符)
- 15151Cannot find the object/principal because it does not exist or you do not have permission(找不到对象/主体,因为它不存在或您没有权限)
- 4834You do not have permission to use the bulk load statement(您没有使用大容量加载语句的权限)