私は次のように機能するトランザクションアプリケーションを持っています:
try {
$db->begin();
increaseNumber();
$db->commit();
} catch(Exception $e) {
$db->rollback();
}
そして、increaseNumber()内に、このようなクエリがあります。これは、このテーブルで機能する唯一の関数です。
// I use FOR UPDATE so that nobody else can read this table until its been updated
$result = $db->select("SELECT item1
FROM units
WHERE id = '{$id}'
FOR UPDATE");
$result = $db->update("UPDATE units SET item1 = item1 + 1
WHERE id = '{$id}'");
すべてがトランザクションにラップされていますが、最近、かなり遅いクエリを処理していて、アプリケーションで多くの同時実行が行われているため、クエリが特定の順序で実行されることを実際に確認することはできません。
デッドロックによりACIDトランザクションが中断する可能性はありますか?何かを追加する関数とそれを削除する関数がありますが、デッドロックがあると、トランザクションが無視されたように、データが完全に同期していないことがわかります。
これは必ず起こるのでしょうか、それとも何か問題がありますか?
ありがとう、ドミニク