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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

2回答

4251閲覧

updateの途中でselectした場合どのようなデータが取得されますか?

ohamo749

総合スコア0

MySQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2020/10/16 04:44

編集2020/10/16 04:45

前提条件

例えば以下のような状況を想定しています。

  1. 1億件のデータが入っているテーブル users を作成する。エンジンはInnoDBを選択。
  2. 以下SQLを実行する

update users set column = 1;
3. 2のSQL実行途中で以下のSQLを実行する
select * from users where column = 1;

聞きたい事

3の時どのような結果が得られますか?

以下の資料を読む限り2のようなSQLを実行すると自動的にトランザクションが作成されてロックがかかると理解しました。
なので、私はCと思っているのですがあっていますでしょうか?
https://dev.mysql.com/doc/refman/5.6/ja/commit.html

  • A. 実際にテーブル情報が書き換えられるのはSQL実行完了後なので、途中に実行した3のSQLの結果は0件。
  • B. 実際にテーブル情報が書き換えられるのはSQL実行途中なので、途中に実行した3のSQLの結果は0~1億件。
  • C. update実行中はテーブルがロックされるので、2のSQL実行後に3のSQLが実行される。よって3のSQLの結果は1億件。

環境

MariaDB 10.5.5

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

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

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

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

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

m.ts10806

2020/10/16 04:45 編集

実際にやってみては? 1億件作らなくても、数万、数十万くらいとかで。
ohamo749

2020/10/16 04:51

はい、もちろん私の方でも試すための環境を用意している途中です! 学習環境を崩したくないので1からMariaDB 10.5.5のインストールをしたところです。 思いの外設定に手間がかかっていて用意している間にあわよくば回答を頂ければ並列なので効率いいかと思ったので先に投稿させてもらいました! また、実際に試した結果と私の理解している内容が必ず一致するとも限らないので誰かの回答が欲しくて質問しました! 例えばテーブルロックではなく別の要因だけど結果がCと同じになる場合があるかな?と思いましたので。
m.ts10806

2020/10/16 04:52

ん- スタートラインに立ってない状態で質問するのはあまり効率は良くないかと思いますし、 結局自分で試さないと理解にはつながらないかと思います。「わかった気」になるだけです。
ohamo749

2020/10/16 04:56

わかりました、試した後にまた質問内容を付け加えて質問させてもらいます! その時は詳しそうなのでm.ts10806さんも是非回答お願いします!
m.ts10806

2020/10/16 04:57

あとは結局「どうしたいか」だけかと思います。 ロックについても明示的にすることもできます。 アプリケーションの仕様や要件次第でもあります。
yambejp

2020/10/16 09:26

すくなくともトランザクションは自動的には発動しません
guest

回答2

0

SELECT ~ FOR UPDATEもご存じないでしょうから、
MySQL - InnoDBのロック関連まとめ
を熟読の上、実際にSQLを実行できる環境を用意して動作確認することをお薦めします。

投稿2020/10/16 04:54

Orlofsky

総合スコア16417

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

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

0

質問にあるURLにある以下のリンクも熟読して下さい。
14.2.4 一貫性非ロック読み取り

トランザクション分離レベルによって、ダーティリード、ファジーリード、ファントムリードの発生するしないが変わってきます。
アプリケーションエンジニアが知っておくべきMySQLのロック

別途、排他制御についても調べておいた方が良いと思います。
排他制御(楽観ロック・悲観ロック)の基礎

尚、リンク先については内容の精査までは行っていませんので、公式以外は鵜呑みなさらないように。

投稿2020/10/16 08:34

sazi

総合スコア25327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問