回答編集履歴
1
SELECT FOR UPDATEにし忘れていた
    
        answer	
    CHANGED
    
    | @@ -3,11 +3,12 @@ | |
| 3 3 | 
             
            MySQLのInnoDBでは、テーブル全体をロックしなくても、`SELECT ... FOR UPDATE`で、適切なデータについてだけロックを掛けることができます(そうすれば、他のユーザーについては処理を続けられます)。
         | 
| 4 4 |  | 
| 5 5 | 
             
            ```SQL
         | 
| 6 | 
            +
            -- トランザクションに入る
         | 
| 6 | 
            -
            --  | 
| 7 | 
            +
            -- (実際には、DBライブラリやフレームワークの機能を使ったほうがいいかもしれません)
         | 
| 7 8 | 
             
            BEGIN TRANSACTION;
         | 
| 8 9 |  | 
| 9 10 | 
             
            -- 特定のユーザーのログイン行だけロックを掛ける
         | 
| 10 | 
            -
            SELECT MAX(login_time) AS latest FROM table_name WHERE user_id = '***';
         | 
| 11 | 
            +
            SELECT MAX(login_time) AS latest FROM table_name WHERE user_id = '***' FOR UPDATE;
         | 
| 11 12 |  | 
| 12 13 | 
             
            -- PHP側で値をチェックして、適切なら行を追加する
         | 
| 13 14 | 
             
            INSERT INTO table_name (後略)
         | 
