質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

6175閲覧

UPDATEしたその時の値をSELECTする方法

tesopgmh

総合スコア146

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2018/01/18 05:23

例えば、
IDは主キーINTのオートインクリメント
VALUEはINTだとして

|ID|VALUE|
|1|1|

UPDATE dtb SET value = value + 1 WHERE id=1;

というVALUEをカウントアップするSQLを走らせると
AさんBさんCさん3人で同時にカウントアップしたとしても
その人数分ちゃんと+3カウントアップされていると思います

結果
|ID|VALUE|
|1|4|

しかし
Aさんは13のうちどの数値(タイミング)だったのか
Bさんは1
3のうちどの数値(タイミング)だったのか
Cさんは1~3のうちどの数値(タイミング)だったのか

という情報が知りたい場合はどうすればいいのでしょうか??
つまりそれぞれの人が「アップデートした時点」のデータをセレクトしたいです。

SELECTしてからUPDATEすると、UPDATEされる前のデータを3人が呼び出してしまう可能性があり
UPDATEしてからSELECTすると、UPDATEされた後のデータを3人が呼び出してしまう可能性があります

これはやはりテーブルロック(MyISAMの場合)みたいな仰仰しい排他ロックをかけないと実現できないものなのでしょうか
なお、オートインクリメントは使いません

お忙しいところ恐縮ですが分かる方お教えくださいませ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これはやはりテーブルロック(MyISAMの場合)みたいな仰仰しい排他ロックをかけないと実現できないものなのでしょうか

テーブルロックほど仰々しくはないですが、SELECT value FROM dtb WHERE id = 1 FOR UPDATE;とすることで、この行だけロックを掛けて値を取得することができます。

なお、トランザクション内での実行が必要です。

投稿2018/01/18 05:30

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tesopgmh

2018/01/18 05:34

私が欲しかった情報ドンピシャでした!! FOR UPDATE初めて知りました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問