回答編集履歴
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 (後略)
|