• ベストアンサー

MYSQLのトランザクションについて質問です!

すいません!表題の件で3点質問させてください。 質問1 MySQLの5.0.51を使っていますが、 トランザクションって、どのテーブルが対象なんでしょうか? 例えば、START TRANSACTION とかで開始したりすると、 データベース内のinnoDBのテーブルは、 すべてが対象となるんでしょうか? それとも、readとかwriteとかして 1つづつ指定しないといけないんでしょうか? 質問2 トランザクションすると、 もしやテーブルって、 自動的にreadロックやwriteロック設定された状態になるのでしょうか? 質問3 readロックやwriteロックですが、 書き込み禁止って、どちらなのでしょう? 今まで、ずっとreadロックと勝手に思っていたのですが、 私のMySQLコマンドブック読んでると、 writeロックのような気がしてきたので、 確認のためです… 超愚問、どなたかお付き合いよろしくお願いしますm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

質問1への回答 START TRANSACTION は 次のsql文待ち状態です。 ロック対象は、「InnoDB は、行レベルでロックを行う」とあるので、 これ以降のsql文で、insertやupdate、deleteなどtable内容を変更するsql文の対象tableの変更対象行です。 質問2への回答 START TRANSACTION 後にinsertやupdate、deleteなどtable内容を変更するsql文が発行された時に、その対象tableの該当行は書き込み禁止となります。 でも、読みとりもロックしないと、結局後から不整合な変更をされてしまうと困るので、そういう場合はREAD COMMITTED も設定して、read lock も行う必要があるでしょう。 というか、4.0.5 より前のバージョンでは、READ UNCOMMITTED(読みとり許可)の方が使えなかったらしいけど。 「InnoDB は、行レベルでロックを行う」とあるので、おなじtable の別の行については、 他のアクセスから、変更可能、ということです。 質問3 書き込み禁止 → そのまま意訳して write lock ですよ? 古いバージョンでは、結局、読み書き両方ロックだったようだけど。 4.0.5 以降では、read lock については SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED を設定すると、読みとりロックがはずれる。でも不整合が起きやすくなるので、普通は、こういう設定にはしないでしょう。

micchicchi
質問者

お礼

うわああ、ありがとうございます! >書き込み禁止 → そのまま意訳して write lock なるほど、やはりそうなんだ… なんで、素直にそう考えられなかったのか、 思い込みって怖いですね… それ以外も、的確にご回答ありがとうございます! 自分がtansaction全然わかってなかった事が、 よーく分かりました><

その他の回答 (1)

回答No.2

まず、前置きです。 排他制御の基本的な考え方は、どのRDBMSでも同等なのですが、細かな部分でいろいろな違いがあります。また、排他制御に関する用語も、各RDBMSで方言がかなり使われています。 さらに、他のRDBMSと同等の機能にするために、細かなオプションがたくさんあり、それを指定する場所も 「SQL中に、SQLの一部分として書く」 「SQL中に、コメントとして書く」 「SQLとは別の場所で書いておく」 などであり、さらにはキーワードも各RDBMSにより異なっています。 排他制御について考える時、次の3点を整理しておく必要があると、私は考えています。 (1)排他制御する資源・・・テーブル、行など (2)排他制御する区間・・・1SQL実行中だけとか、トランザクション内とか、COMMITしても継続してロックし続けるといったものも存在する (3)共用度・・・参照さえも許さない、参照同士は共用可能、更新中でも参照可能、特定の資源であれば更新同士でも共用可能など、様々な方法があります。 これらを整理して理解するは、開発しようとするシステムの要件を十分に精査する必要があります。 回答1 START TRANSACTION時点では、どのテーブルを操作するか未定なので、この時点ではユーザテーブルなどについてはロックはされません。 「データベース」というのは、create databaseで作る「データベース」ということでいいのでしょうか?なぜこんなことを確認するかというと、各RDBMSにより「データベース」の概念に違いがありまして。 MySQLでは、「select * from db1.t1」のように、テーブル名をデータベース名で修飾でき、複数のデータベースを操作できます。つまり、START TRANSACTION時点では、操作対象のデータベースが未定のものがあります。 回答2 トランザクションでなくても、テーブルや行などのロックは行われます。ただ、排他制御する区間が、「1SQLの実行中」であったりと短いだけです。 回答3 細かなオプションで変わってきて、MySQLのこの辺の仕様について詳しい訳ではないですが。。。 readロックであれば、他ユーザからの参照は許し、他ユーザからの更新は禁止です。 writeロックであれば、他ユーザからの参照も禁止です。ただし、最初の方で述べたように「更新中でも参照可とする」などといった細かなオプションがあり、それらの組み合わせで仕様が変わってきます。

micchicchi
質問者

お礼

前置きに感動しました! 排他制御する区間ってのもあるんですね… データベースは、そうです、create databaseで作る方です。 これも、具体的に教えていただいて大変勉強になりました。 transaction理解度ゼロなことが、 chukenkenkoの投稿でよーく分かりました… 個人的覚書に全文コピペさせていただきますm(__)m ありがとうございます!

関連するQ&A