[前][次][番号順一覧][スレッド一覧]

mysql:10018

From: <kuyo@xxxxxxxxxx>
Date: Sat, 14 Aug 2004 19:58:36 +0900
Subject: [mysql 10018] Re: データのロックについて


山本です。

この話題に関して、松枝さんの気分を害されない形で議論をする自信が私には
ありませんので、返答と私がこの議論で学んだことや思ったことを纏めたいと
思います。(逃げと受け止めて貰っても結構です)
私の発言に絡むことのみであり、他の方の議論をこのメールで全て纏めようと
いう意図ではありません。

やや冗長な文になってしまったので、興味のない方は読まれないことをお勧め
します。


・MSDE での検証結果の詳細を挙げなかったことについて

 そもそも私が「REPEATABLE READ の挙動に関して正しく実装されているプロ
  ダクトは何か」という質問をした意図は、希望する回答に「これこれがそう
  です」といった程度のものであり、自身で検証するにはどうしたらよいかで
  はありませんでした。

  自身での検証は本意ではなかったのですが、確かに MSDE は無料で入手でき、
  自分でも検証が出来るかと思い行ってみました。

  私にとって MSDE は理解が浅く検証手順が正しくない可能性があります。こ
  こで「この検証手順と結果は正しいのでしょうか?」といった質問をしてし
  まうと、MySQL ではなくMSDE 自体の話題になってしまう可能性があります。
  目的も MSDE の学習ではありませんし、「他の RDBMS の話は余所でやって
  欲しい」と言われれば反論できませんので、あえて結果を挙げませんでした。

・implicit_transactions を on にした理由

  MySQL での set autocommit=0 となるべく同じ条件で検証したかったからで
  す。
  http://www.microsoft.com/japan/SQL/evaluation/compare/fororacle/SQLserver_02_Chap5_01.asp
  (URLなので改行なしです)
  これを夾雑とは捉えておりません。


・検証結果について

  過去の投稿メールから引用します。

  [mysql 09975]より
  >> repeatable readは、同一トランザクションにおいて、複数回の
  >> selectコマンドが発行された場合、選択されたレコードが他の
  >> トランザクションの影響を受けない「分離性」です。
  >>
  >> なので、松枝知直さんが提示された以下の例では、
  >>
  >>      term1                           | term2
  >>     ---------------------------------+--------------------
  >>      set autocommit=0;               |
  >>                                      | set autocommit=0;
  >>      select * from BBB;              |
  >>                                      | select * from BBB;
  >>      update BBB set ID=2 where ID=1; |
  >>                                      | select * from BBB;
  >>      commit;                         |
  >>                                      | select * from BBB;
  >>      select * from BBB;              |
  >>
  >> term1でcommitを発行してレコード更新を確定したとしても、
  >> term2のトランザクションは続いたままなので、repeatable r
  >> eadの分離性のために、term2の3つのselectコマンドは全て
  >> 同じ結果になります。
  >>
  >> term2が、term1での更新結果を取り込むには、term2のトラ
  >> ンザクションを終了させる必要があります。(たとえば、commit
  >> コマンドなどで)
  >> とみたまさひろさんが、「..常にイン・トランザクション,,,」といった
  >> のは、こういう意味じゃないでしょうか。
  >
  > 接続2(term2)がイン・トランザクションであれば、その通りでしょうね。で
  >も、akiraさんの論理は少々のmissing linkと言うか、飛躍があるのです。接続
  >2(term2)がイン・トランザクションである事を、証明不要な事実と仮定(じゃな
  >くて断定、かな?)していませんか?
  >

  [mysql 10013] の検証は明示的にトランザクションを開始しているので、
  MySQL における set autocommit=0 の状態と異なっていますね。

  また、akira さんの返答に対し「イン・トランザクションであれば…」と同
  意していますが [mysql 10013] の結果は、

  「明示的にトランザクションを開始しており他のトランザクションの影響を
  受けずトランザクション中の select の結果が一貫しているものの、ロック
  によって [mysql 09975] と同じ手順で SQL 発行を行うことが出来ない」

  ことを表していると理解しました。

  [mysql 10013] では [mysql 09975] 及び 例の元となった [mysql 09953] 
  の説明には不十分であると思いました。MSDE の挙動を元にするならば、
  「ここでロックが発生し一貫性を保つはずなのにロックが発生しないのはお
  かしい」などの指摘になると考えます。


まとめとして、私が今までの議論で得た見地を挙げます。

・REPEATABLE READ で set autocommit=0 での MySQL の挙動
  トランザクション中は他のトランザクションの影響によって select
  ... from ... の結果が変わる事はない。なぜならばトランザクション開始
  後、select ... from ... 発行時にその時点のスナップショットが作成され、
  結果はスナップショットから取得されるからである。

・同条件での MSDE の挙動
  トランザクション中は他のトランザクションの影響によって select
  ... from ... の結果が変わる事はない。なぜならばトランザクション開始
  後、select ... from ... の結果は確定されたデータを必ず返すからである。
  データが確定できない場合は、確定できるまでトランザクションの進行はロッ
  クされる。

・SQL92 や MySQL, 他の RDBMS においても MySQL での set autocommit=0 状
  態では select ステートメントでトランザクションが開始され、明示的にト
  ランザクションを終了するまで終了しない。
  (これを否定する根拠が見当たらなかったため)

・分離レベルの概念は ANSI などで定義されているが、その実装は RDBMS に
  よって異なる場合がある。実装が異なると見た目の挙動も変わるが、どちら
  が正解とは単純に言うことは出来ない。
  (今回の MySQL と MSDE の挙動の違い、他の例として
    http://www.oracle.co.jp/2shin/2002/ora51/20.html
  など)

・MySQL, MSDE では同じ分離レベルでも実装モデルや挙動が異なるので、それ
  ぞれの特性をよく理解し、混同しないようにすべきである。

  おまけですが、MySQL ではロックを獲得する SQL ステートメントに drop 
  は含まれないようです。drop するときには気をつけねば。
  http://dev.mysql.com/doc/mysql/ja/InnoDB_Locks_set.html


長々と書いてしまいました。最後まで読んでくれた方には慰労の意を表したい
ところです。
いままで余り係わってこなかったトランザクションについて、一定の知識を得
られたので大いに収穫がありました。またよく聞く「デッドロックで云々」は、
RDBMS によっては容易に起こりうる事だったのですね。MySQL のみの知識では
理解できなかったでしょう。

それでは。

----
Hideki Yamamoto
kuyo@xxxxxxxxxx

[前][次][番号順一覧][スレッド一覧]

      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]