1

以下のコードを使用すると、スナップショット分離をオフにできません。SQL Server 2012 ボックスを使用しています。新しい空のデータベースを作成し、スナップショット分離をオンにすることはできますが、オフに戻すことはできません。

「allow_snapshot_isolation OFF」行は、車輪を回転させるだけです。

ALTER DATABASE SNAP SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE SNAP SET allow_snapshot_isolation OFF
ALTER DATABASE SNAP SET read_committed_snapshot off
ALTER DATABASE SNAP SET MULTI_USER 
4

2 に答える 2

0

データベースで他のトランザクションが実行されていないことを確認しますか? 使用される暗黙のトランザクションについて思い出してください。JDBC ドライバーによる (Autocommit を false に設定した場合)。

以前のトランザクションのいずれかが保留中の場合、スナップショット分離をオフにすることはできません。これは、他のトランザクションが以前の行バージョンを使用しようとしないことを確認する必要があるためです。ただし、複数のデータベースにまたがるクエリを作成することは可能であるため、スナップショット分離の設定は、1 つのデータベースでトランザクションを処理するだけではありません。

sp_who2およびを使用SELECT * FROM sys.sysprocessesして変更プロセスを検索することで、これが当てはまるかどうかを確認できます。sp_who2プロセスが中断されていることが示され、使用sys.sysprocessesすると、おそらく最後の待機タイプが「DISABLE_VERSIONING」であることがわかります。

したがって、解決策はすべてのトランザクションをロールバックすることです(または暗黙のトランザクションの場合は接続を閉じます)。一部のプログラムから接続プールを使用している場合、たとえば、2 つまたは 3 つのデータベースで 40 の暗黙的なトランザクションが開かれている可能性があることに注意してください。スナップショット モードをオンにした後にそれらを開いた場合、スナップショット モードをオフにすることはそれらが終了するまで不可能です。

于 2016-03-15T08:58:53.887 に答える