レコードを挿入するストアドプロシージャを作成しました。クエリの挿入のすぐ上に「Begin Transaction」を追加して、クエリを実行します。同じテーブルのレコードを含むWebページを表示している別のアプリケーションが、挿入が完了するまでにハングしていることに気付きました。
Begin Transactionがテーブル全体をロックするのはなぜですか? ライターはリーダーをブロックしないでください。デフォルトでオンになっている必要があります。
SQL-Server 2005 Expressを使用しています。 OracleとMySQLが同じ状況をどのように処理するかについても知りたいです。
トランザクションの開始は、トランザクションの開始です。トランザクションを終了するまで、テーブルに他のデータを書き込むことはできません。これは、データベースにACID基準を適用するための仕様です。 http://en.wikipedia.org/wiki/ACID
複数のクエリを1つのアトミック操作であるかのように実行する必要がある場合は、トランザクションを使用します。原子性が必要ない場合は、トランザクションを使用しないでください。
これは非常に基本的なものですが、データベースコードを作成する前に基本的なデータベース理論を刷新する必要がある場合があります。トランザクションなどのコア原則に慣れていない場合、アプリに重大な損害を与える可能性があります。
他の人が言ったことは基本的に正しいですが、この動作は、使用しているトランザクション分離レベルによって異なります。トランザクションがテーブル全体をロックしないことが技術的に可能です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
ライターはリーダーをブロックしないでください
これは スナップショット分離 の場合にのみ当てはまります。他のすべての分離レベルでは、書き込みブロッカーをブロックするリーダーとリーダーをブロックするライターの両方が必要です(ダーティリードは 矛盾 であるため考慮されません)。決して使用されません)。この動作が必要な場合は、行のバージョン管理を使用してください(リンクにはソリューションが含まれています)。
一括挿入でテーブル全体がロックされるのはなぜですか?
これは、実際には正しい場合とそうでない場合があります。動作はあなたの管理下にあります:
[〜#〜] tablock [〜#〜]
一括インポート操作中にテーブルレベルのロックが取得されることを指定します。テーブルにインデックスがなく、TABLOCKが指定されている場合、テーブルは複数のクライアントによって同時にロードできます。デフォルトでは、ロック動作はテーブルオプション
table lock on bulk load
によって決定されます。
詳細については、製品仕様 一括インポートのロック動作の制御 を参照してください。