ホーム   フォーラム   FAQ
 
メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

トランザクションについて教えて下さい。

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 18:28
nkmt  長老   投稿数: 1668
そうですね。

SQL側にトランザクション開始が送られるんですね。
私も勉強になりました。


投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 18:20
Tanda  長老   投稿数: 2151
nkmtさん、

これはRollbackが掛かるというよりも、何か1つでもテーブル
をオープンすることによって、SQL側にトランザクション開始の
コマンドが送られるということなんだと思います。

私も勉強になりました。TKitabayashiさん、情報をありがとう
ございました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-1-7 17:26 | 最終変更
nkmt  長老   投稿数: 1668
Kitabayasi様

はい、おっしゃる通り、実験では、子タスクでデータオープンせずに、孫タスクをコールしているだけでした。

トランザクションを開始するタスクで、更新には無関係なデータを宣言したりするだけでもRollbackかかるように出来るんですね。

トランザクション処理を行う全データを宣言しないといけないかと思いました。
それだと大変気を使いますもんね。
勉強になりました。実験でもその通りになりました。


皆様ありがとうございました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 12:48
Tanda  長老   投稿数: 2151
TKitabayashiさん、

貴重な情報をありがとうございました。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-1-7 11:58
TKitabayashi  一人前   投稿数: 90
解決しているところ、申し訳ございませんが、
RollBackしても孫タスクEだけしか戻らなかった時、
子タスクでは、孫タスクC,D,Eをコールしているだけではないでしょうか。

恐らく、子タスク内でテーブルを参照していなかったと思います。

子タスク内にテーブルがなければトランザクションが始まらないので、孫タスクC,D,Eはそれぞれ更新していることになります。

孫タスクで書き込むデータをD=宣言しなくても、
無関係なテーブルをD=宣言したり、照会リンクを作ったりしても
RollBackがかかると思います。
投票数:2 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 11:29
Tanda  長老   投稿数: 2151
nkmtさん、

HAYATOさんのアドバイスで解決してよかったですね。

> 物理トランザクションは、DBMSの機能を利用してのトランザクション。
> 遅延トランザクションは、RIAなどでも実現出来るようMagic独自のトランザクション
> と考えてよろしいでしょうか?

はい、そうです。遅延は単なる、階層構造の持てるワークだと
考えると分かりやすいですよ。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2015-1-7 11:23
nkmt  長老   投稿数: 1668
Tandaさん、HAYATOさん、明けましておめでとうございます。
いつもお世話になりありがとうございます。
本年もよろしくお願い致します。

試しました。

子タスクを P=物理トランザクションにして、
孫タスクで書き込むデータをD=宣言 したら、ちゃんとRollBackがかかりました。

どうもありがとうございました。

そういえばそんな事を教えてもらった事を思い出しました。
普段滅多にトランザクションを使わないものですから。

更新を行うデータを忘れずに全部宣言しとかないと、
中途半端にRollbackされるという事なんですね。


物理トランザクションは、DBMSの機能を利用してのトランザクション。
遅延トランザクションは、RIAなどでも実現出来るようMagic独自のトランザクション
と考えてよろしいでしょうか?
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 11:00
HAYATO  一人前 居住地: 大阪市淀川区西中島5-9-2  投稿数: 90
nkmtさん、明けましておめでとうございます。
本年も宜しくお願いします。

子タスクBで各孫タスクで更新するテーブルが書き込み(W) オープンされていなくて、トランザクションが子タスクBで開始していないのでは?
(つまり孫タスクC,D,E それぞれの個別トランザクションのみが、それぞれで開始している状態)

HAYATO@アインシュタイン設計社
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 10:57
Tanda  長老   投稿数: 2151
ISHIJIMAさん、

これは、遅延処理はすべてメモリ上で展開されるので、そのことを
留意したうえで使用するようにということだと思います。

メモリが十分にあって、メモリスワップもうまく行っているので
あれば、とくに問題ないと思います。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-1-7 10:53
Tanda  長老   投稿数: 2151
nkmtさん、

これは私の勘なんですが、物理の場合はネストができませんので、
ひょっとすると孫でのRollbackは無視されるのかもしれません。

トランザクションを開始したタスク、つまり子タスクでRollbackを
掛けてみてください。

うまく行くといいのですが。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2015-1-7 10:23 | 最終変更
nkmt  長老   投稿数: 1668
バッチ子タスクB を 物理トランザクション

バッチ孫タスクC を W=親と同一
バッチ孫タスクD を W=親と同一
バッチ孫タスクE を W=親と同一
にして、孫バッチE で ROLLBACK をかけても
孫バッチC、孫バッチD で行った更新は、残ったままになります。

これそういう物なのでしょうか?
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-1-6 23:58 | 最終変更
ISHIJIMA  長老 居住地: 静岡県  投稿数: 1827
遅延で大量のデータをタスク前の前では使用しない方が良いと思いました。

ヘルプで「タスクレベルのトランザクションの使用」で検索してみて下さい。

注意:
遅延モードで動作させている場合は、トランザクションを「タスク前の前」で実行するようにはしないでください。これらの処理はキャッシュに保存されますが、キャッシュサイズには限りがあります。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 | 投稿日時 2015-1-6 21:28
nkmt  長老   投稿数: 1668
お世話になっております。

MagicのトランザクションとROLLBACKで恥ずかしながら教えて下さい。


データベースはMS SQLで以下のタスク構造だとします。


オンライン親タスクA(実行指示画面)

  その下に バッチ子タスクB

    孫バッチタスクC
    孫バッチタスクD
    孫バッチタスクE

孫バッチタスクEで矛盾発見した場合、
孫バッチ処理でC,D,Eの更新を全て取り止めたいとします。


実行指示画面は更新処理はないので
トランザクション=無しにします。

バッチ子タスクBを
    D=遅延トランザクション
    トランザクション開始を T=タスク前の前。

孫バッチタスクは、
    トランザクションモードを W=親と同一
    トランザクション開始を N=なし

孫バッチタスクE
  の中で、アクション Rollback('FALSE'LOG,0)

以上実験上はうまくいっているのですが、懸念がありますでしょうか?
教えて下さい。
投票数:0 平均点:0.00

  条件検索へ


Copyright (C) Magic Software Japan K.K. All Rights Reserved.
個人情報保護方針 会員規約