![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
すいません!表題の件で3点質問させてください。
質問1
MySQLの5.0.51を使っていますが、
トランザクションって、どのテーブルが対象なんでしょうか?
例えば、START TRANSACTION とかで開始したりすると、
データベース内のinnoDBのテーブルは、
すべてが対象となるんでしょうか?
それとも、readとかwriteとかして
1つづつ指定しないといけないんでしょうか?
質問2
トランザクションすると、
もしやテーブルって、
自動的にreadロックやwriteロック設定された状態になるのでしょうか?
質問3
readロックやwriteロックですが、
書き込み禁止って、どちらなのでしょう?
今まで、ずっとreadロックと勝手に思っていたのですが、
私のMySQLコマンドブック読んでると、
writeロックのような気がしてきたので、
確認のためです…
超愚問、どなたかお付き合いよろしくお願いしますm(__)m
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?e8efa67b6d)
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
を設定すると、読みとりロックがはずれる。でも不整合が起きやすくなるので、普通は、こういう設定にはしないでしょう。
うわああ、ありがとうございます!
>書き込み禁止 → そのまま意訳して write lock
なるほど、やはりそうなんだ…
なんで、素直にそう考えられなかったのか、
思い込みって怖いですね…
それ以外も、的確にご回答ありがとうございます!
自分がtansaction全然わかってなかった事が、
よーく分かりました><
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ロックであれば、他ユーザからの参照も禁止です。ただし、最初の方で述べたように「更新中でも参照可とする」などといった細かなオプションがあり、それらの組み合わせで仕様が変わってきます。
前置きに感動しました!
排他制御する区間ってのもあるんですね…
データベースは、そうです、create databaseで作る方です。
これも、具体的に教えていただいて大変勉強になりました。
transaction理解度ゼロなことが、
chukenkenkoの投稿でよーく分かりました…
個人的覚書に全文コピペさせていただきますm(__)m
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのロック
-
SELECT時の行ロックの必要性に...
-
AccessShareLock はどの程度気...
-
SQLServer Insertが遅い
-
SELECT文でのデッドロックに対...
-
Oracleの排他制御について教え...
-
SELECT FOR UPDATE にトランザ...
-
パススルークエリでのロックに...
-
MongoDBのデータ更新はDBを排他...
-
INSERTにおいてロック処理は必要か
-
「マスタ」と「テーブル」の違...
-
ACCESSのSQLで、NULLかNULLでな...
-
既に使用されているので、使用...
-
ACCESS2007 フォーム 「バリア...
-
SQLServer 分散トランザクショ...
-
ビューで引数を使いたい
-
エクスポート時の改行コードに...
-
ACCESS 一番最新の日付の金額...
-
Accessにインポートしたら並び...
-
オラクルではできるのにSQLSERV...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
accessのロック
-
AccessShareLock はどの程度気...
-
SQLServer Insertが遅い
-
MongoDBのデータ更新はDBを排他...
-
Oracleの排他制御について教え...
-
DB2のロック調査
-
同一トランザクションの中でテ...
-
ExcelからAccess2013DBを更新す...
-
同時書き込み
-
INSERTにおいてロック処理は必要か
-
更新ロックとデッドロック
-
SELECT文でタイムアウト...
-
DB2でSelectした時(rollback,c...
-
UPDATE文で発生するデッドロッ...
-
トランザクション中にSELECTし...
-
SELECT FOR UPDATE にトランザ...
-
ADOで排他ロックがうまくいかない
-
SQLServerの明示的なロックの仕...
おすすめ情報