2011-07-31 8 views
3

私は、トランザクションは、MySQL(InnoDBの)の原子であることを読みましたが、私は5つのスレッド内の次のコードをテストするとき、彼らは同じIDを選択:MySQLトランザクションはアトミックですか?

$db->beginTransaction(); 

$row = $db->fetchRow("SELECT * FROM atomic WHERE selected = 0 LIMIT 1"); 

sleep(5); 

$db->update("atomic", array('selected' => 1), "id = " . $row['id']); 

$db->commit(); 

echo "Selected row: " . $row['id']; 
+1

私は、アトミック性ではなくテーブルロックについて質問していると思います... –

+0

ありがとうございます。 (Gracias) – Wiliam

+0

前のスレッドコミットが実行される前に、変数$ rowがすべてのスレッドで割り当てられていると思います。 –

答えて

5

あなたはこのシナリオでFOR UPDATEキーワードを見ている必要があります。

単純な選択は選択した行をロックしないため、あなたの例で見ているものは完全に正常です。

+0

期待通りに働いた、ありがとう:) – Wiliam

関連する問題