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

mysqlの最後の挿入IDの取得はトランザクションでどのように機能しますか? +トランザクションの質問

    最初の質問に答えるには...

    トランザクションを使用する場合、接続に関する限り、クエリは通常どおり実行されます。コミットするか、それらの変更を保存するか、ロールバックしてすべての変更を元に戻すかを選択できます。次の擬似コードを検討してください。

    insert into number(Random_number) values (rand()); 
    select Random_number from number where Number_id=Last_insert_id();
    

    // php

    if($num < 1)
       $this->db->query('rollback;'); // This number is too depressing.
    else
       $this->db->query('commit;'); // This number is just right.
    

    生成されたランダム番号は、コミットする前に読み取って、保存する前にすべての人が見ることができるように適切であることを確認できます(たとえば、行をコミットしてロックを解除します)。

    PDOドライバーが機能しない場合は、mysqliドライバーの使用を検討してください。それがオプションでない場合は、いつでもクエリ'select last_insert_id()asid;'を使用できます。 $ this-> db-> insert_id()関数ではなく。

    2番目の質問に答えるために、他のモデルが更新または読み取るデータを挿入または更新する場合は、必ずトランザクションを使用してください。たとえば、列'Number_remaining'が1に設定されている場合、次の問題が発生する可能性があります。

    Person A reads 1
    Person B reads 1
    Person A wins $1000!
    Person A updates 1 to be 0
    Person B wins $1000!
    Person B updates 0 to be 0
    

    同じ状況でトランザクションを使用すると、次の結果が得られます:

    トランザクション分離レベル> 同様に。

    この場合に発生する可能性のあるデッドロックに注意してください:

    最後に、人物BはおそらくPHPのmax_execution_timeに到達しているためです。 、現在のクエリはPHPとは関係なく実行を終了しますが、それ以上のクエリは受信されません。これがautocommit=0のトランザクションであった場合、PHPサーバーへの接続が切断されると、クエリは自動的にロールバックされます。




    1. SQLクエリレコードを頻度で並べ替える

    2. oracle11gとHibernateSpringとjsfの統合

    3. MySQL Workbench-スキーマはデータベースと同じものですか?

    4. フォームphpのサニタイズと検証