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

mysql:9992

From: "Tomo Ikehara" <"Tomo Ikehara" <tomo_ikehara@xxxxxxxxxx>>
Date: Wed, 11 Aug 2004 08:54:15 +0700
Subject: [mysql 09992] Re: データのロックについて

池原と申します。

私も訳が分からなくなってる人間の1人なので、発言させてください。

>     SET AUTOCOMMIT = 0 でオートコミットモードがオフになると、ユーザが
>     常にトランザクションを開いていると見なされます。このユーザが SQL
>     の COMMIT または ROLLBACK ステートメントを実行すると、現在のトラン
>     ザクションが終了し、新しいトランザクションが開始されます。どちらの
とみたさんが引用してくださった以上の文より、
1.SET AUTOCOMMIT =0 とすると、常にトランザクションを開いていると見なされ
る。
     →トランザクションが閉じている(=開始されていない)状態をとりえない。
2.COMMITを実行すると新しいトランザクションが開始される。
     (これは”1”を前提とすると、そうなるしかないですね。)
と理解しました。

松枝さんが[mysql 09953]で提示された例のようなテストを、以下のようにやってみ
た場合、
どうなるのでしょうか。
(以下引用に修正を加えています。)

     term1                           | term2
    ---------------------------------+--------------------
     set autocommit=0;               |
                                     | set autocommit=0;	<--(1)
     select * from BBB;              |
     update BBB set ID=2 where ID=1; |
                                     | commit;		<--(2)
     commit;                         |
                                     | select * from BBB;	<--(3)
     select * from BBB;              |

この場合のterm2を見てみると、
(1)でトランザクションが開始され、
(2)でトランザクションが終了されると同時に新しいトランザクションが開始され
る。
よって(3)ではID=1と表示される、ということでしょうか。
※読み取りのみのクエリである(3)で新しくトランザクションは開始されないという
前提で
   話をしております。
(今手元にMySQLの環境が無いので、自身でテストしておりません。
  すみませんがどなたかテストしていただくことは可能でしょうか?)

私は、
     常にトランザクションを開いていると見なされる。
     →トランザクションが閉じている(=開始されていない)状態をとりえない。
という認識がなかったため、以下のようなケースで混乱します。

1.
例えば「月間作業予定を表示する画面があって、ユーザーはその画面上である作業の
内容を変更し、更新ボタンを押下することで変更内容をDBに反映すると同時に、変更
したもの以外を含む全ての作業予定の最新を画面に表示しなおす。」というシステム
があったとします。
更新ボタンが押下された時の処理としては
  (1)押下したユーザーの入力内容のDBへの反映。(UPDATE-->COMMIT)
  (2)その時点で最新の月間作業予定データを取得し、画面にセット。(SELECT)
 と考えられます。
ここで(2)においてSELECT文を発行して取得したデータは、厳密に言うとその時点で
最新のものではないのですね?((1)でCOMMITをした時点のデータが取得されるはず
だから。)
私は今まで「(1)の処理でCOMMITした後はトランザクションは開始されていない状
態」だと考えていたので、(2)では、その時点で最新のデータが取得できると考えて
いました。
このようなケースでは、みなさんどのようにコーディングされますか?(SELECT文発
行直前にわざわざCOMMITする?)

2.
トランザクションをCOMMITしても、また新しいトランザクションが開始されてしまう
のであれば、SET AUTOCOMMIT =0 とした場合、最後のトランザクションを終了するの
はDBに対する接続を閉じた時となるのでしょうか?
私は今までCOMMITした後は新しいトランザクションは開始されないと理解していたの
で、UPDATE-->COMMITの後には開始されているトランザクションは存在せず、接続を
閉じるときには閉じるのみ(おかしな表現ですね)だと考えていました。
これは特に問題ないのでしょうか?
例えばWebシステムのようにDB接続のプーリングを使用しているようなケースでも大
丈夫なのでしょうか?
(プーリングについてよく理解していないにもかかわらず発言し申し訳ないです
が、)トランザクションが生きている状態というのはDBMSは何かしらの管理をしなけ
ればいけないと思うので、「アプリケーションが接続をクローズしてもプーリングを
管理するコンポーネントとDBとの間の接続はそのまま生きるので、無駄にトランザク
ションが生きているという状態にならないのでしょうか。
もしこのようなことが発生するのであれば、アプリケーションにおいてDB接続をク
ローズ(プールに返す)直前に、SET AUTOCOMMIT=1 とする必要があるのでしょう
か。
(何かこのような話を聞いたことがあるような無いような気もしてきた…ようなこな
いような(^^;)

以上 長々と失礼しました。
ご意見お聞かせいただけると幸甚です。


> -----Original Message-----
> From: とみたまさひろ [mailto:tommy@xxxxxxxxxx]
> Sent: Tuesday, August 10, 2004 9:40 PM
> To: ml@xxxxxxxxxx
> Subject: [mysql 09989] Re: データのロックについて
>
>
> とみたです。
>
> On Tue, 10 Aug 2004 20:28:36 +0900
> ML account <ml@xxxxxxxxxx> wrote:
>
> >  なるほど。確かにそれでも説明が付きます。non-autocommitモードだと
> > commit/rollbackの後に自動的にトランザクションが開始される、と言うのは、
> > マニュアルのどの辺に書いてあるのでしょう?
>
> 私もちゃんとマニュアルを調べて発言しているわけではなく、怪しげな記憶に
> 頼って発言していたので、この機にマニュアルを読んでみました。
>
> この辺でしょうか…。
>
> http://dev.mysql.com/doc/mysql/ja/InnoDB_transaction_model.html
>
>     SET AUTOCOMMIT = 0 でオートコミットモードがオフになると、ユーザが
>     常にトランザクションを開いていると見なされます。このユーザが SQL
>     の COMMIT または ROLLBACK ステートメントを実行すると、現在のトラン
>     ザクションが終了し、新しいトランザクションが開始されます。どちらの
>     ステートメントも、現在のトランザクションで設定されたすべての
>     InnoDB ロックを解除します。COMMIT を実行すると、現在のトランザクショ
>     ンで加えられた変更が確定し、他のユーザが認識できる状態になります。
>     一方、ROLLBACK ステートメントを実行すると、現在のトランザクション
>     によって加えられたすべての変更が取り消されます。
>
> >  ですが、それは相当に異様でしょうね。 commit/rollbackの後に自動的にトラ
> > ンザクションを開始される(自動トランザクション開始、とでも呼びますか)、そ
> > のメリットは何でしょう。
>
> さあ、なんでしょう。私はトランザクションはあまり使わないので…。
>
> >  更に、「自動トランザクション開始」を仮定すると、その接続は常にイン・ト
> > ランザクションと言う事ですね。つまり常にアクティブなトランザクションが残
> > る事になります。そうなると、マニュアルの別の所で色々と齟齬を生じてしまい
> > ます。例えば rename tableとか。こんな説明があったりします。
> >
> > > When you execute RENAME, you can't have any locked tables or active
> > > transactions.
>
> この記述ははなんでしょうね。実際に試してみたら、BEGIN 後でも RENAME は
> 成功してしまいますし…。こんな記述もありました。
>
> http://dev.mysql.com/doc/mysql/ja/Implicit_commit.html
>
>     次のコマンドでは、トランザクションが(コマンドの実行前に COMMIT を
>     発行した場合と同じように)暗黙的に終了します。
>
>     コマンド		コマンド 	コマンド
>     ALTER TABLE 	BEGIN		CREATE INDEX
>     DROP DATABASE 	DROP INDEX 	DROP TABLE
>     LOAD MASTER DATA 	LOCK TABLES 	RENAME TABLE
>     SET AUTOCOMMIT=1 	START TRANSACTION 	TRUNCATE
>
> こっちの記述の方が実際の動きに合ってるようです。
>
> >  「自動トランザクション開始」は、read-opの selectでトランザクションが開
> > 始されてしまうのと同程度に異様に見えます。もう、何が何だか訳が分からなく
> > なって来ましたね。
>
> いえ、私は別に異様とも思いませんし、そんなに訳が分からなくなってはいま
> せん。このスレッドを読んでると、訳が分からなくなってるのは松枝さんだけ
> のような気もしますが :-)
>
> --
> とみたまさひろ <tommy@xxxxxxxxxx>
> 日本MySQLユーザ会 http://www.mysql.gr.jp

__________________________________________________
GANBARE! NIPPON!
Yahoo! JAPAN JOC OFFICIAL INTERNET PORTAL SITE
http://mail.ganbare-nippon.yahoo.co.jp/


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

      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]