sql >> データベース >  >> RDS >> Mysql

Doctrineを使用してデッドロック後にトランザクションを再試行するにはどうすればよいですか?

    デッドロックはエラー1213を返しますが、これはクライアント側で処理する必要があります

    デッドロックとロック待機は別のものであることに注意してください。デッドロックでは、「失敗した」トランザクションはありません。どちらも有罪です。どちらがロールバックされるかは保証されません。

    rollbackを使用する必要があります 、スタイルコードは重複を挿入します。たとえば、次のようにする必要があります:

    $retry = 0;
    
    $done = false;
    
    
    $this->entityManager->getConnection()->beginTransaction(); // suspend auto-commit
    
    while (!$done and $retry < 3) {
    
        try {
    
            $this->entityManager->flush();
    
            $this->entityManager->getConnection()->commit(); // commit if succesfull
    
            $done = true;
    
        } catch (\Exception $e) {
    
            $this->entityManager->getConnection()->rollback(); // transaction marked for rollback only
    
            $retry++;
    
        }
    
    }
    

    この助けを願っています。



    1. OracleからMySQL/Perconaサーバーに移行する方法

    2. MySql 8をlaravelで実行するにはどうすればよいですか?

    3. PHP + MySQL +ストアドプロシージャ、アウトバリューにアクセスするにはどうすればよいですか?

    4. SQLで設定されたルールに基づいて列の行をフィルタリングする