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

パスワード:


パスワード紛失

レコードロック解除待ち

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 | 投稿日時 2014-9-1 18:53
n_kawashima  半人前   投稿数: 21
お世話になります。

Magic xpa 2.3b PT3/Oracle12c でシステムを運用しています。
元々はMagic V8で動かしており、マイグレーションしたシステムです。
プログラムの修正は一切しておりません。

運用中にレコードロック解除待ちが多発して困っております。

プログラム内のトランザクションの設定がおかしいのではないかと思っているのですが、
実際のところどう修正すればよいのかわかりません。

いま現象が出ているプログラムの指定内容は以下のとおりです。
指示画面と集計処理が別プログラムで、指示画面から集計処理プログラムをプログラムコールしています。
集計処理プログラムでOracleのテーブルを更新しています。

集計処理プログラムは複数の子タスクがあり、トランザクションの指定がいろいろ混在しています。

指示画面プログラム(オンライン)
 トランザクションモード P=物理
 トランザクション開始  L=レコードロック時
 キャッシュ範囲     N=なし
 ロック方式       O=入力時
 エラー発生時      A=アボート


集計処理プログラム(バッチ)
 トランザクションモード P=物理
 トランザクション開始  T=タスク前の前 と L=レコードロック時
 ロック方式       I=即時
 エラー発生時      A=アボート


ご教授の程よろしくお願い致します。
他にもOracleを使用した場合に注意すべき点がございましたら合わせてご教授頂ければ幸いです。
よろしくお願い致します。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 12:51
Tanda  長老   投稿数: 2151
n_kawashimaさん、こんにちは。

集計処理プログラムのトランザクション開始が「タスク前の前」に
なっていますと、そのタスクで処理されるレコードのすべてにロック
が掛かりますが、それは意図した処理ですか?

つまり、そのタスクが終わるまで、そこで処理されるレコードのロック
は解除されない動作になります。

集計処理が単にデータの読み取りと計算だけの処理でしたら、
トランザクションは無くてもいいと思いますよ。
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014-9-2 15:09
n_kawashima  半人前   投稿数: 21
Tandaさん、早速のご回答ありがとうございます。

トランザクション開始が「タスク前の前」に指定している
のは意図的か?のご質問についてですが、意図的では
ありません。

Magic V8のプログラムでトランザクション指定していたのを
マイグレーションしたら「タスク前の前」になっておりま
したので、そのまま使用しておりました。

Magic V8で運用していたときのOracleのバージョンは10g
でしたが問題なく動作しておりました。

しかしながらMagic xpaではエラーとなってしまいます。

集計処理を実行中にエラーとなった場合、ロークバック
させたいのですが、その場合のトランザクション指定は
どのようにすればよいのでしょうか。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 15:23
Tanda  長老   投稿数: 2151
n_kawashimaさん

マイグレーション前は、トランザクション開始はどこになって
おりましたか?
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2014-9-2 16:32
n_kawashima  半人前   投稿数: 21
Tandaさん

マイグレーション前のトランザクション指定は以下のとおりです。
各ツリーごとに記載します。

集計処理というのが親タスクで子タスクをコールしている
だけです。(タスク終了条件:Yes チェック時期:A=後置)

集計処理のタスク前処理で、タスクAをコール
レコード後処理で、タスクB → C → Dをコール
しています。

タスクAはマスタを参照し、情報を変数にセットしています。
タスクBはテーブルをメインでオープンし、更新しています。
タスクCはマスタを参照し、C−1タスクをコールしています。
タスクC−1ではタスクCで取得したマスタ項目をキーとして
テーブルをメインでオープンし、別のテーブルに集計した値を
登録しています。
タスクDはマスタをメインでオープンし、更新しています。

集計処理 トランザクション:N=なし Yes
|
|-- タスクA トランザクション:N=なし Yes
|-- タスクB トランザクション:L=オンロック No
|-- タスクC トランザクション:L=オンロック Yes
|-- タスクC−1 トランザクション:L=オンロック No
|-- タスクD トランザクション:L=オンロック No

よろしくお願い致します。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 16:40
Tanda  長老   投稿数: 2151
n_kawashimaさん

つまり、マイグレーション前はトランザクション「なし」になっていた
のが、マイグレーションしたら、「タスク前の前」になっていたという
状況でしょうか?

もしそうであれば、前の環境と同じようにトランザクション「なし」に
戻してみてはいかがでしょうか?
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014-9-2 16:59
n_kawashima  半人前   投稿数: 21
Tandaさん

確かに、マイグレーションしたら、「タスク前の前」に
なっていた、という状況です。
ご指摘の通り、トランザクション「なし」とすればうまく
動作すると思いますが、集計処理中にエラーになったら
ロールバックするようにしたいです。

いろいろやってみてはいるのですが、F8チェックでエラーに
なったりしてうまくいきません。

Magic xpaでは、どのように指定すればよいのでしょうか。

ご教授の程よろしくお願い致します。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 18:39
Tanda  長老   投稿数: 2151
n_kawashimaさん

物理トランザクションでなく、遅延トランザクションを使ってみると
いいかもしれません。

遅延トランザクションでは悲観的ロックは発生しませんので、
レコードロックの解除待ちは起こりません。

ただし、プログラムの全体像が分かりませんので、それでうまく
行くという保証はいたしかねますが。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014-9-2 18:51 | 最終変更
ISHIJIMA  長老 居住地: 静岡県  投稿数: 1827
物理トランザクションで
ロールバックするようにトランザクションをかけるのであればレコードロックは仕方がないではないでしょうか・・
レコードロックは発生させたくなくてロールバックする方法はないのでは・・
相反していませんか?
違っていたらすみません。
投票数:0 平均点:0.00
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 19:11
pu_mahalo  長老 居住地: 大阪  投稿数: 775
こんにちは Puです

ISHIJIMAさんのおっしゃるとおりです。

ロックを出来るだけ少なくしたいのなら
レコードロック無し、トランザクション無しで
一旦 memory table に集計し

正常に集計が終わったら
その後 memory tableから 実tblにupdate するとか

でわ〜でわ〜
投票数:0 平均点:0.00
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 19:21
Tanda  長老   投稿数: 2151
「レコードロックの解除待ち」を引き起こすのは、物理トランザク
ションを用いたときの、悲観的ロックの場合だけです。

遅延トランザクションの楽観的ロックであれば、「レコードロック
の解除待ち」を引き起こすことなく、ロールバックが可能です。

遅延トランザクションが発案された理由のひとつでもありますね。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2014-9-2 19:25
n_kawashima  半人前   投稿数: 21
Tandaさん、ISHIJIMAさん こんばんは。

物理トランザクションをやめて、遅延トランザクションで
やってみようと思います。

遅延トランザクションでもネスト遅延というのもあるのですね。
いろいろ試してみます。

うまくいった折にはお知らせ致します。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 19:29
Tanda  長老   投稿数: 2151
n_kawashimaさん

その通りです。物理トランザクションはネストができませんので、
一部だけコミットとか、一部だけアボートとかできませんが、
遅延トランザクションはネストによってこれが可能になります。

ただし、リアルタイムの悲観的ロックは効かなくなりますので、
用途によって使い分ける必要がでてきますね。(^^)
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2014-9-2 22:29
ISHIJIMA  長老 居住地: 静岡県  投稿数: 1827
私が勘違いしているかもしれませんが遅延トランザクションは長いバッチ処理には向いていないのではないでしょうか?
現在レコードロックが頻繁にかかるようなバッチ処理であれば遅延トランザクションでバッチ処理を行うと1件でも更新されているとロールバックされませんか?
私の勘違いでしたらすみません。
投票数:0 平均点:0.00

  条件検索へ


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