web-dev-qa-db-ja.com

「クエリの挿入」の前に「トランザクションの開始」がテーブル全体をロックするのはなぜですか?

レコードを挿入するストアドプロシージャを作成しました。クエリの挿入のすぐ上に「Begin Transaction」を追加して、クエリを実行します。同じテーブルのレコードを含むWebページを表示している別のアプリケーションが、挿入が完了するまでにハングしていることに気付きました。

Begin Transactionがテーブル全体をロックするのはなぜですか? ライターはリーダーをブロックしないでください。デフォルトでオンになっている必要があります。

SQL-Server 2005 Expressを使用しています。 OracleとMySQLが同じ状況をどのように処理するかについても知りたいです。

6
RPK

トランザクションの開始は、トランザクションの開始です。トランザクションを終了するまで、テーブルに他のデータを書き込むことはできません。これは、データベースにACID基準を適用するための仕様です。 http://en.wikipedia.org/wiki/ACID

複数のクエリを1つのアトミック操作であるかのように実行する必要がある場合は、トランザクションを使用します。原子性が必要ない場合は、トランザクションを使用しないでください。

これは非常に基本的なものですが、データベースコードを作成する前に基本的なデータベース理論を刷新する必要がある場合があります。トランザクションなどのコア原則に慣れていない場合、アプリに重大な損害を与える可能性があります。

5
Bart B

他の人が言ったことは基本的に正しいですが、この動作は、使用しているトランザクション分離レベルによって異なります。トランザクションがテーブル全体をロックしないことが技術的に可能ですis

変更中に他のユーザーがデータを読み取れるようにするには、TILをREAD UNCOMMITEDに設定します。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED

もちろん、この設定にはveryを注意深く行う必要があります。これは、他のユーザーが時間。

詳細はこちら:

http://msdn.Microsoft.com/en-us/library/ms189122.aspx
http://msdn.Microsoft.com/en-us/library/ms173763.aspx

4
Massimo

ライターはリーダーをブロックしないでください

これは スナップショット分離 の場合にのみ当てはまります。他のすべての分離レベルでは、書き込みブロッカーをブロックするリーダーとリーダーをブロックするライターの両方が必要です(ダーティリードは 矛盾 であるため考慮されません)。決して使用されません)。この動作が必要な場合は、行のバージョン管理を使用してください(リンクにはソリューションが含まれています)。

一括挿入でテーブル全体がロックされるのはなぜですか?

これは、実際には正しい場合とそうでない場合があります。動作はあなたの管理下にあります:

[〜#〜] tablock [〜#〜]

一括インポート操作中にテーブルレベルのロックが取得されることを指定します。テーブルにインデックスがなく、TABLOCKが指定されている場合、テーブルは複数のクライアントによって同時にロードできます。デフォルトでは、ロック動作はテーブルオプションtable lock on bulk loadによって決定されます。

詳細については、製品仕様 一括インポートのロック動作の制御 を参照してください。

1
Remus Rusanu