DBAtlas · データベース運用アトラス

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) はスナップショットのワークロードが少ないメンテナンス時間帯に実施する。アプリケーションでこのエラーを捕捉し、自動再試行ロジックを実装する。長時間実行のスナップショットトランザクションを短くする。

DBAtlas で開く →

同じデータベースの他の項目