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 に対応する 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(一括読込み文を使用する権限がない)