0

InnoDB のロック メカニズムを理解しようとしています。

次のPHPスクリプトがあるとしましょう:

mysql_query('BEGIN;');
$a=mysql_query('SELECT id, status FROM testtable WHERE id=123 LIMIT 1 FOR UPDATE;'); 
$res=mysql_fetch_assoc($a);
$b=somefunction($res['id']);
$c=someotherfunction($b);
mysql_query('UPDATE testtable SET status=1 WHERE id=123;');
mysql_query('COMMIT;');

somefunction() と someotherfunction() の内部では、同じテーブルだけでなく、他のテーブルからも多くの他のクエリを実行します。id=123 の testtable から他のフィールドも選択します。

このセッション内で id=123 を使用してやりたいことは何でもできますが、他のセッションはロックが解放されるのを待ちます。

最初のクエリで「for update」を使用しているため、ロックされるのは testtable 内の唯一の行です。同じセッションで選択/更新/挿入された他のテーブルまたは行はそのまま (ロック解除) されていますか?

someotherfunction() が id=123 で別のフィールドを選択して更新するとどうなりますか? これは可能ですか?ロックは残りますか?

4

1 に答える 1