mysql:10009
From: <kuyo@xxxxxxxxxx>
Date: Thu, 12 Aug 2004 11:57:26 +0900
Subject: [mysql 10009] Re: データのロックについて
山本です。 松枝さんはこれ以上スレッドを伸ばすおつもりが無いようですが、 ネタを振られたのでもう少しおつき合い願えますか。 「どのような実装があるか」という私の問いに対して教えて頂いた MSDE で検 証を行っていますが、私の予想とは異なる挙動になっています。ですが MSDE(SQL server) は詳しくなく、ODBC 経由で autocommit=0 状態にするのも web を漁らねばならぬ程度の知識なので、自身の検証結果に自信がありません。 端末1 と 端末2 の例に戻ります。 REPEATABLE READ で autocommit=0 です。 松枝さんが望む挙動は、「端末1 で commit された結果が時系列で直後の端末 2 の select の結果に反映する」と理解しました。(上記の私の予想がこの動 作です) InnoDB では、「端末2 で commit しなければ端末2 の select に反映されず、 挙動が正しくない」と理解しました。 私の検証では松枝さんの望む挙動が再現できず、また InnoDB と MSDE の挙動 も異なりました。松枝さんのお話しと MSDE, InnoDB の挙動といずれが正しい か判断できません。みなさんの検証ではいかがでしょうか。 (MSDEでの私の検証結果の詳細はさしあたって伏せておきます) 参考までに MSDE 用に用意した SQL です。 term* :: が、それぞれの端末で発行する SQL です。 create database TEST create table BBB ( ID int) term1 :: delete from BBB term1 :: insert into BBB values (1) term1 :: set transaction isolation level repeatable read term1 :: set implicit_transactions on term2 :: set transaction isolation level repeatable read term2 :: set implicit_transactions on term1 :: select * from BBB term2 :: select * from BBB term1 :: update BBB set ID=2 where ID=1 term2 :: select * from BBB term1 :: commit term2 :: select * from BBB term1 :: select * from BBB # 余談ですが石野さんが firebird の例を挙げられましたが、これは私が # 他の RDBMS ではどうか、という意味の話題を振った為でしょう。 # 多数決などで決めようといった意味は無いと思います。 ---- Hideki Yamamoto kuyo@xxxxxxxxxx At Thu, 12 Aug 2004 10:30:19 +0900, ML account wrote: > > こんにちは。 > > EBIHARA Yuichiro <uiebi@xxxxxxxxxx>さんの > <20040811065327.90892.qmail@xxxxxxxxxx> > "[mysql 10000] Re: データのロックについて" > > お、キリ番ですね。(笑) > > > > ある接続がイン・トランザクションであるとして、そのトランザクションに > > > 対して重大な影響を与える他の接続での操作を許してしまうのは、一体どうい > > > う事なんでしょうね。「トランザクションが暗黙的に終了します」は、その影 > > > 響を喰らう他の接続のトランザクションも、と言う事ですか?(笑) > > > > これは、例えばテーブルAをUpdateしているトランザクションXがあったときに、 > > 別のトランザクションYがテーブルAをDropしたら、トランザクションXも暗黙的に > > 終了してしまうの? という疑問でしょうか? > > > > MySQLがどうかは知りませんが、普通はトランザクションXはテーブルAそのものに > > 対して共有ロックを取得するから、トランザクションYはDROP TABLE文でロック待 > > ちになるもんなんじゃないでしょうか。 > > そう、ロックで待ちになる、が正解と言うか、ボクが期待するだろう動作です > ね。ボクが想定していたのは、片方がselect、もう片方がrenameです。 > > REPEATABLE READ分離レベルは「イン・トランザクションでの複数のselectが > 同じ結果を返す」ですが、「他のプロセス/トランザクションによって、 > selectされた結果が変更される事は無い」と説明されている場合もありますね。 > となると、 REPEATABLE READ分離レベルは共有ロックで実現される事が実はキモ > だったりするのかもしれません。 > > > > > REPEATABLE READ分離レベルのイン・トランザクションで REPEATABLE > > > READが保証されない場合がある事、これは結構重大ですね。本来あってはなら > > > ない事ですから。ダーティリードと逆のコミットされているデータが読めな > > > い、selectの結果を信じて出したupdate等が実はスカになってしまう、などと > > > 言う珍妙な事も起こりますね。REPEATABLEREAD分離レベルの動作としては、 > > > 「コミットされたデータ」の存在自体がかなり異様でしょう。 > > > > この一節がよく分からなかったので補足していただけるとうれしいのですが、MySQL > > のどの現象を指してREPEATABLE READ分離レベルを指定してもREPEATABLE READに > > ならないとおっしゃっているのでしょうか。 > > それともマニュアルにそう読める部分があるということですか。 > > 「REPEATABLE READが保証されない」は[mysql 10005]のとみたさんの試行です。 > 「ダーティリードと逆の」は、ボクのREPEATABLE READ分離レベルでの挙動に対 > する元々の疑問ですし(常にイン・トランザクションと言うのは意外でしたが)、 > また [mysql 09992]で池原さんが述べられている疑問です。「update等が実はス > カ」もそれのバリエーションですね。 > > 同じ事の繰り返しになってしまいますが、REPEATABLE READ分離レベルは共有 > ロックで実現する事が重要なのでしょう。そうであれば「コミットされたデータ」、 > ある接続でのselect対象に他の接続がupdateを掛けコミットする、の様な事は端 > から起こらない訳で。単純に「同じ結果」を追求するあまり、「じゃあスナップ > ショット」が、実際あれれなのかとも思います。 > > −−− > > MySQL/InnoDBは、ロストアップデートが起こっている気がしますし(以前述べ > た様に再現は出来ませんでしたが)、トランザクションの動きに関して微妙に ( > 盛大に?)イヤな所がある、の印象を持っています。 > > まあしかし、「MySQLの真価はトランザクションのサポートでは無い、その高 > 速性にある」は持論ですから、トランザクションが使える使えないはボク的には > 些末な事ですね。Oracleやその他のデコレーテッドDBMSにあってMySQLに無い(無 > かった)機能は、トランザクション、サブクエリ、ストアードプロセジャ、トリ > ガ、スキーマ等ですが、この中でボクが一番欲しいのはサブクエリ (アトミック > でないと困りますけど)、その次はストアードプロセジャですね。トランザクシ > ョン、トリガ、スキーマは、ボク的にはMySQLに要らなかったりします。 > > しかし些末な事なのにも関わらず、何でここまでこのスレッドが伸びてしまっ > たのかは、考えるに感覚の相違なのでしょうか。ボクがある事を些末と考える事 > と、その些末な事が妥当であるかどうかや、妥当な根拠で妥当と言っているのか > 否かは、ボク的には別の事だったりします。 > > > 松枝知直 <tomom@xxxxxxxxxx> > http://www.argus.ne.jp/~tomom/ > > >
9940 2004-08-04 13:17 ["Mamiya Masataka" <x] データのロックについて 9943 2004-08-05 10:06 ┣["Mamiya Masataka" <x] 9944 2004-08-05 10:36 ┗[ML account <ml@xxxxx] 9945 2004-08-05 11:26 ┣[seiji takegata <take] 9946 2004-08-05 13:30 ┃┣[ML account <ml@xxxxx] 9949 2004-08-05 15:24 ┃┃┗[EBIHARA Yuichiro <ui] 9951 2004-08-05 23:09 ┃┃ ┗[ML account <ml@xxxxx] 9952 2004-08-05 23:19 ┃┃ ┣["TAKAHASHI, Tomohiro] 9953 2004-08-06 05:37 ┃┃ ┃┗[ML account <ml@xxxxx] 9954 2004-08-06 05:51 ┃┃ ┃ ┗[ML account <ml@xxxxx] 9955 2004-08-06 11:25 ┃┃ ┃ ┗["HIROSE, Masaaki" <h] 9957 2004-08-06 13:30 ┃┃ ┃ ┗[ML account <ml@xxxxx] 9958 2004-08-06 14:04 ┃┃ ┃ ┣[SUGAWARA Hajime <sug] 9959 2004-08-06 14:17 ┃┃ ┃ ┣[とみたまさひろ <tomm] 9960 2004-08-06 16:50 ┃┃ ┃ ┗["HIROSE, Masaaki" <h] 9962 2004-08-07 16:49 ┃┃ ┃ ┗[ML account <ml@xxxxx] 9969 2004-08-09 18:24 ┃┃ ┃ ┣[<kuyo@xxxxxxxxxx> ] 9970 2004-08-10 00:20 ┃┃ ┃ ┃┗["akira" <akrst@xxxxx] 9975 2004-08-10 09:30 ┃┃ ┃ ┃ ┗[ML account <ml@xxxxx] 9976 2004-08-10 10:48 ┃┃ ┃ ┃ ┣["TAKAHASHI, Tomohiro] 9997 2004-08-11 13:03 ┃┃ ┃ ┃ ┗[<akrst@xxxxxxxxxx> ] 9983 2004-08-10 18:28 ┃┃ ┃ ┣[とみたまさひろ <tomm] 9987 2004-08-10 20:28 ┃┃ ┃ ┃┗[ML account <ml@xxxxx] 9988 2004-08-10 21:26 ┃┃ ┃ ┃ ┣[<kuyo@xxxxxxxxxx> ] 9994 2004-08-11 11:38 ┃┃ ┃ ┃ ┃┗[ML account <ml@xxxxx] 10004 2004-08-12 01:03 ┃┃ ┃ ┃ ┃ ┗[Tomoyuki Ishino <ish] 10006 2004-08-12 08:54 ┃┃ ┃ ┃ ┃ ┗[ML account <ml@xxxxx] 10012 2004-08-13 12:52 ┃┃ ┃ ┃ ┃ ┗[Tomoyuki Ishino <ish] 10014 2004-08-13 20:08 ┃┃ ┃ ┃ ┃ ┗[ML account <ml@xxxxx] 9989 2004-08-10 23:39 ┃┃ ┃ ┃ ┗[とみたまさひろ <tomm] 9992 2004-08-11 10:54 ┃┃ ┃ ┃ ┣["Tomo Ikehara" <tomo] 9995 2004-08-11 12:08 ┃┃ ┃ ┃ ┃┣["TAKAHASHI, Tomohiro] 10001 2004-08-11 16:16 ┃┃ ┃ ┃ ┃┃┣["TAKAHASHI, Tomohiro] Re: データのロックについて(余談:START TRANSACTION) 10003 2004-08-12 00:51 ┃┃ ┃ ┃ ┃┃┃┗[とみたまさひろ <tomm] 10011 2004-08-13 11:06 ┃┃ ┃ ┃ ┃┃┗["Tomo Ikehara" <tomo] 9999 2004-08-11 15:40 ┃┃ ┃ ┃ ┃┗[EBIHARA Yuichiro <ui] 10017 2004-08-13 22:42 ┃┃ ┃ ┃ ┃ ┗["Tomo Ikehara" <tomo] 9993 2004-08-11 11:38 ┃┃ ┃ ┃ ┗[ML account <ml@xxxxx] 10000 2004-08-11 15:53 ┃┃ ┃ ┃ ┣[EBIHARA Yuichiro <ui] 10008 2004-08-12 10:30 ┃┃ ┃ ┃ ┃┗[ML account <ml@xxxxx] -> 10009 2004-08-12 11:57 ┃┃ ┃ ┃ ┃ ┗[<kuyo@xxxxxxxxxx> ] 10013 2004-08-13 20:07 ┃┃ ┃ ┃ ┃ ┗[ML account <ml@xxxxx] 10016 2004-08-13 22:02 ┃┃ ┃ ┃ ┃ ┣[とみたまさひろ <tomm] 10018 2004-08-14 19:58 ┃┃ ┃ ┃ ┃ ┗[<kuyo@xxxxxxxxxx> ] 10005 2004-08-12 01:32 ┃┃ ┃ ┃ ┗[とみたまさひろ <tomm] 10010 2004-08-13 01:25 ┃┃ ┃ ┗["HIROSE, Masaaki" <h] 9956 2004-08-06 11:44 ┃┃ ┗[EBIHARA Yuichiro <ui] 9974 2004-08-10 09:30 ┃┃ ┗[ML account <ml@xxxxx] 9982 2004-08-10 16:41 ┃┃ ┗[EBIHARA Yuichiro <ui] 9986 2004-08-10 20:25 ┃┃ ┗[ML account <ml@xxxxx] 9950 2004-08-05 16:20 ┃┗[HAMAI Kyoichi <k-ham] 9947 2004-08-05 13:35 ┗["Mamiya Masataka" <x] 9948 2004-08-05 15:03 ┗[ML account <ml@xxxxx]