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 で別のフィールドを選択して更新するとどうなりますか? これは可能ですか?ロックは残りますか?