SQL標準では、マルチテーブルクエリのロック順序が指定されていますか?例えばマルチテーブルクエリのロック順序を決定する要因は何ですか?
は、所与:
SELECT department.id FROM permissions, terminals, departments WHERE department.id = ? AND terminal.id = ? AND permissions.parent = department.id AND permissions.child = terminals.id;
- をSQL標準がロック順序を保証しないか、(実装に固有)実行計画によって決定されますか?
- ロックオーダーを保証する方法はありますか?
- ロックの順序を保証する方法がない場合は、どのようにデッドロックを防止する必要がありますか?
UPDATE:あなたの推理を説明することなくこの問題を閉じるには投票しないでください。限り、私は懸念している、これはプログラミング上の質問です、それは非常にスタックオーバーフローのトピックになります。質問をさらに洗練させる必要があると思われる場合は、説明してください。私はあなたにお答えできます。
SELECTクエリはデッドロックを招くロックを生成しません。あなたは本当の状況に関連するようにあなたの質問を言い換えることができますか? –
@ GordonLinoff、READ_COMMITTEDのSELECTクエリはロックを生成しますが、ステートメントの実行中はロックを生成します。他の分離レベル(REPEATABLE_READやSERIALIZABLEなど)では、トランザクションの終了までロックを保持します。注意:一部のデータベースではロックを使用しないMVCCを使用していますが、これらはこの問題の対象外です。 – Gili
ロックは実装の詳細です。隔離レベルは、起こりうる/起こり得ない現象を特定するだけである。 SQL Serverでは、コミットされた読み込みでクエリを選択すると、ほとんどの場合、データが読み込まれるとすぐに解放される 'S'ロックが使用されます(ステートメントの終了前)。ステートメントが終了するまでこれらのロックを保持することもできます(例:http://blogs.msdn.com/b/craigfr/archive/2007/05/31/read-committed-and-large-objects.aspx)。それ以外のときは行レベルの 'S'ロックをまったく取らない。特定のRDBMSを指定しないかぎり、ポイント1の2と3のポイントは返答できません。 –