🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Q&A

2回答

1362閲覧

mysqlのトランザクションについて

gakkie

総合スコア1

MySQL

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

0グッド

1クリップ

投稿2021/01/08 09:00

mysqlで複数テーブルを齟齬なく更新したいので、トランザクションを実装したいです。

それにあたって3つ質問よろしいでしょうか

###質問その1
次の言葉の理解はあっていますか?
「トランザクション」=「テーブルロック」
「トランザクションを発行する」=「テーブルをロックする」

###質問その2
更新したいテーブルは posts_table と count_table の2つがあります。
posts_table 更新のためにAトランザクションを発行し、次に count_table 更新を普通にすると、count_table は更新がされていませんでした。

この解決策は、

①posts_table 更新のためのAトランザクションが終わってから、count_table 更新のためのBトランザクションを発行しなければならない
②Xトランザクションとして、posts_table と count_table の2つをまとめて更新しなければならない
③そもそもトランザクションを発行しないままで posts_table と count_ttable を更新しなければならない

といういずれかである。という理解であっていますか?

###質問その3
上記①②はどちらがいいのでしょうか?
つまりトランザクション処理は、複数走らせるべきなのでしょうか?一つにまとめるべきなのでしょうか?

■複数走らせる①の場合
Aトランザクション( posts_table 更新 )

Bトランザクション( count_table 更新 )

Cトランザクション( posts_table 取得 )

■一つにまとめる場合②の場合
Xトランザクション( posts_table 更新、count_table 更新、posts_table 取得 )

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

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

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

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

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

hentaiman

2021/01/08 09:03

質問の書き方にもあったと思いますが、試した事を書きましょう。 試して理解出来ないところを自身の解釈の記載と併せて質問しましょう。 何も試していないならまず試しましょう。何度もサンプルデータを作ったり消したりしながら試せば分かる事もあるでしょう。
gakkie

2021/01/08 09:06

質者その2にある解決策が試したことになります。試した結果①も②も成功致しました。しかしどちらがいいのか?という疑問が湧きました。ゆえの質問投稿です。
maisumakun

2021/01/08 09:09

> posts_table 更新のためにAトランザクションを発行し、次に count_table 更新を普通にすると、count_table は更新がされていませんでした。 日本語ではなく、実行したSQLを書いてください。
guest

回答2

0

たとえばトランザクションでselect for updateしてなければ
テーブルはロックされないので他のSQL実行が先行して処理されて
トランザクションによる排他処理にならないこともあります

投稿2021/01/08 11:43

yambejp

総合スコア116694

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

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

yambejp

2021/01/08 12:43 編集

create table tbl(id int primary key,val int); insert into tbl values(1,100),(2,200),(3,300); として start transaction; select sleep(5); insert into tbl values(4,400); commit;(すみません、rollbackて書いてしまってました) を発行すると同時に別のSQL insert into tbl values(4,500); を実行すると、ロックされていなので4,500が投入される
yambejp

2021/01/08 11:46

排他処理したいなら start transaction; select * from tbl for update ; select sleep(5); insert into tbl values(4,400); commit; end
gakkie

2021/01/08 12:33

コード補完ありがとうございます。大変参考になる例でした。
guest

0

次の言葉の理解はあっていますか?

違います。トランザクション制御は「排他制御」のみならず「アトミック性の確保(トランザクション内の実行は、全部成功するか全部失敗するかのどちらかにしかならない)」のためにも行われます。

投稿2021/01/08 09:08

maisumakun

総合スコア145977

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

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

maisumakun

2021/01/08 09:10

> トランザクション処理は、複数走らせるべきなのでしょうか?一つにまとめるべきなのでしょうか? 「ひとかたまりで行わないとデータが整合しない」ものは1つにまとめてください。
gakkie

2021/01/08 12:32

たしかにそうやって1つにまとめるかどうか分けるべきですよね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問