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

mysql:9946

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Thu, 05 Aug 2004 13:30:56 +0900
Subject: [mysql 09946] Re: データのロックについて

 こんにちは。

seiji takegata <takegata@xxxxxxxxxx>さんの
<200408051126.HDJ78986.LUHUBBBF@xxxxxxxxxx>
"[mysql 09945] Re: データのロックについて"


> ウェブのアプリケーションで排他処理にトランザクションや
> ロックを使おうとしてもうまくいかないことが多くないです
> か?

 それは多分に処理を間違えているだけ、と言うか、相当にまずい処理をやって
いるんだと思いますよ。

 DBについて言えば、ロックやトランザクションの使い方を間違えているとか、
複数のDBセッション(DB接続->クエリ発行-> DB切断)を跨いでの排他制御の様な、
不適当な用途に無理矢理ロックやトランザクションを使っているとか、そういう
のがあります。

 あぁ、InnoDBに関してなら、トランザクションを使う事自体が間違っているの
では、と思いますけど。またOracle8に関して言えば、条件によってはテーブル
ロックが効かない場合もあります。トランザクション(非ネスト)を大量に使うと、
MS-SQL7が吹っ飛んだりトランザクションが機能しなくなる事があります。こう
いうのはトランザクションがちゃんと動かない事の例ですけど、ここでは除外し
ます。


> たとえば、あるレコードをAという人が読み出して、その直後
> にBという人が同じレコードを更新してしまったとします。A
> はそれに気づかずにこのレコードを更新してしまうかも知れ
> ません。その場合、Bが更新した内容は上書きされてしまう
> かも知れません。

 それは当たり前の事でしょう。DBからデータを引っ張って後で書き戻す、対策
(排他制御)無しでこれを行うのは禁じ手です。やっちゃいけない事をやっている
のですから、起こるべくして起こる事が当然の様に起こってしまう、当たり前の
事ですね。


> Aが読み出して更新が完了するまでの間レコードをロックして
> しまえばいいと思われるかも知れませんが、なんらかの理由で
> セッションが切れてしまうと、タイムアウトするまでロックを
> 解除できなくなってしまいますし、誰かが開けっぱなしにして
> いるレコードを他の人が更新できないというのも不便です。

 次のアクションが何時来るか分からないWebベースシステムで、ボクならロッ
ク/トランザクションは使いませんね。大体、使えないかも知れないし。テーブ
ル /レコードをロックする場合、そのロック時間は最小に止めるのは鉄則です。
ロックを掛けっぱなしにするエンジニアも、それを許す/見過ごすデザイナ(アナ
リスト、 PM、 SE)も、市中引き回しの上、磔獄門でしょう。

 ロックを掛けた後、あるいはイン・トランザクションで、処理プログラムがあ
ぼーんとなってしまうと、確かにロックが残って誰も触れなくなる様なDBMSはあ
ります。 Oracleとかね。だから、適切なタイムアウト値の測定や設定が必要な
んです。MySQLに関して言えば、処理プログラムがあぼーんしてDBサーバとの接
続が切れれば、テーブルロックは解除されます。


> こういう可能性がある場合、私はレコードが更新される度に
> カウントアップされるカラムを用意しておいて、読み出した
> ときの値と更新するときの値をチェックし、同じでなければ
> エラーとして処理するようにしています。読み出される頻度
> が多く、たまに更新されるようなアプリケーションではこん
> なやり方で十分な場合が多いと思います。

 そういうやり方もあるでしょう。更新中インジケータをテーブル定義に含めて
排他制御を行う、テーブルアクセス制御テーブルを使用する、等も定番、定石で
すね。


 それと余談ながら、テーブルロックよりもトランザクションの方がシステムへ
の処理速度的なインパクト/ダメージが小さい、は常識化している事ですが、
DBMSの種類や分離レベル如何では、逆の結果になる事があります。



    松枝知直    <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]