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

PHPによるMySQLデッドロックの検出

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

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

    次のようなシナリオでデッドロックが発生します:

    UPDATE  t_first -- transacion 1 locks t_first
    SET     id = 1;
    
    UPDATE  t_second -- transaction 2 locks t_second
    SET     id = 2;
    
    UPDATE  t_second -- transaction 1 waits for transaction 2 to release the lock on t_second
    SET     id = 2;
    
    UPDATE  t_first -- transaction 2 waits for transaction 1 to release the lock on t_first. DEADLOCK
    SET     id = 2;
    

    ロック待機と混同していませんか?

    ロック待機は、トランザクションが別のトランザクションによってすでにロックされているリソースをロックしようとするたびに発生します。

    上記の例では、ステップ 3でロック待機が発生します 。

    これは(デッドロックとは異なり)通常の状況であるため、ロックを保持するトランザクション InnoDB をコミットまたはロールバックすることで、外部から解決できます。 ロックを保持しているトランザクションをロールバックしようとはしません。

    代わりに、タイムアウトが発生した後、ロックを取得しようとしたステートメントをキャンセルするだけです。

    デフォルトのタイムアウトは50です 秒であり、 innodb_lock_wait_timeout

    失敗したステートメント(取得を試みたステートメント ロック)はエラー 1205を返します 。



    1. MySQLMAX_JOIN_SIZEエラー

    2. OracleのJSON_QUERY()関数

    3. エラー1044(42000):すべての権限を持つ「root」のアクセスが拒否されました

    4. Addnoderesolv.confの失敗