| 2009/10/02(Fri) 13:10:51 編集(投稿者)
桐のトランザクション処理(コマンド)と外部DB
尾形さんのトランザクションのコメントで気になることもあり 簡単に調べてみた。(PostgreSQL 7.2)
--------------------------------------------------------- 変数宣言 整数{&hODBC,&Ret} 外部DB 接続,ODBC="hoge",ユーザ名="",パスワード="",接続ハンドル=&hODBC,終了状態=&Ret トランザクション 開始 結合 "!hoge.xvw",,変数使用=する,終了状態=&Ret 表形式編集 トランザクション ロールバック 外部DB 切断,&hODBC,終了状態=&Ret ---------------------------------------------------------
と言う簡単な処理でデータを編集してみた。
やってみて驚いた。「表形式編集」で編集した内容が トランザクション ロールバック で、ロールバックされ、元のデータに戻っている。
次に、「表形式編集」状態で、他の PC で外部DBで同じ表を開き、 編集を行ってみたが、それは可能であった。実際のデータも書き 換わっていた。 そして、「表形式編集」のデータを訂正し終了させ、 そのデータを見てみると、他の PC で変更した内容に戻っていた。 最初に自分が開いた状態の値(編集前に値)とは異なる。
PostgreSQL のログを見てみると、
桐の「トランザクション 開始」コマンドは SQLサーバには何も 明示的な働きはしていない。(BEGINされない)
桐の「トランザクション ロールバック」に関しては、桐からの ロールバック命令が ------------------------------------------------------------ [12.625]conn=03603AC8, query='UPDATE "hoge" SET "hoge"='1000' WHERE "id"=20091443' [14.891]conn=03603AC8, query='ROLLBACK' [14.922]conn=03603AC8, PGAPI_Disconnect ------------------------------------------------------------ と 'ROLLBACK' される。
よく調べてみると、桐の「トランザクション 開始」コマンドはその 実行時においては、SQLサーバには何も明示的な働きはしていない。 (BEGINされない) トランザクションが開始されるのは、UPDATE 命令が発効される時で UPDATE 命令が発生しないときは、「トランザクション ロールバック」 で query='ROLLBACK' .or query='COMMIT' も無い。
すなわち、桐でデータを抽出する段階、訂正を行っている最中に サーバでデータの書き換えが発生すれば(書き換えることも可能)、 ロールバックされるデータは、自分の持っているデータでは無く、 UPDATE 命令が発生される段階のサーバのデータとなる。
桐で、1行でも訂正(UPDATE)が発生すると、その時点からトランザク ション状態となるので、他の PC からはそのデータ(レコード)は 訂正不可能で待機状態となる。
と言うことで、桐の「トランザクション」コマンドも外部DBに有効? なのですね。ただ、有効になるタイミングは実行したときでは無い ので、自分の思っているデータとの整合性は十分に気をつける必要は ありそうです。
|