teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

SELECT FOR UPDATEにし忘れていた

2016/06/06 22:41

投稿

maisumakun
maisumakun

スコア146681

answer CHANGED
@@ -3,11 +3,12 @@
3
3
  MySQLのInnoDBでは、テーブル全体をロックしなくても、`SELECT ... FOR UPDATE`で、適切なデータについてだけロックを掛けることができます(そうすれば、他のユーザーについては処理を続けられます)。
4
4
 
5
5
  ```SQL
6
+ -- トランザクションに入る
6
- -- トランザクションに入る(実際には、DBライブラリやフレームワークの機能を使ったほうがいいかもしれません)
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 (後略)