レコードロック解除待ち
- このフォーラムに新しいトピックを立てることはできません
- このフォーラムではゲスト投稿が禁止されています
ISHIJIMA
居住地: 静岡県
投稿数: 1827
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
私が勘違いしているかもしれませんが遅延トランザクションは長いバッチ処理には向いていないのではないでしょうか?
現在レコードロックが頻繁にかかるようなバッチ処理であれば遅延トランザクションでバッチ処理を行うと1件でも更新されているとロールバックされませんか?
私の勘違いでしたらすみません。
現在レコードロックが頻繁にかかるようなバッチ処理であれば遅延トランザクションでバッチ処理を行うと1件でも更新されているとロールバックされませんか?
私の勘違いでしたらすみません。
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
n_kawashimaさん
その通りです。物理トランザクションはネストができませんので、
一部だけコミットとか、一部だけアボートとかできませんが、
遅延トランザクションはネストによってこれが可能になります。
ただし、リアルタイムの悲観的ロックは効かなくなりますので、
用途によって使い分ける必要がでてきますね。(^^)
その通りです。物理トランザクションはネストができませんので、
一部だけコミットとか、一部だけアボートとかできませんが、
遅延トランザクションはネストによってこれが可能になります。
ただし、リアルタイムの悲観的ロックは効かなくなりますので、
用途によって使い分ける必要がでてきますね。(^^)
投票数:0
平均点:0.00
n_kawashima
投稿数: 21
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
Tandaさん、ISHIJIMAさん こんばんは。
物理トランザクションをやめて、遅延トランザクションで
やってみようと思います。
遅延トランザクションでもネスト遅延というのもあるのですね。
いろいろ試してみます。
うまくいった折にはお知らせ致します。
物理トランザクションをやめて、遅延トランザクションで
やってみようと思います。
遅延トランザクションでもネスト遅延というのもあるのですね。
いろいろ試してみます。
うまくいった折にはお知らせ致します。
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
「レコードロックの解除待ち」を引き起こすのは、物理トランザク
ションを用いたときの、悲観的ロックの場合だけです。
遅延トランザクションの楽観的ロックであれば、「レコードロック
の解除待ち」を引き起こすことなく、ロールバックが可能です。
遅延トランザクションが発案された理由のひとつでもありますね。
ションを用いたときの、悲観的ロックの場合だけです。
遅延トランザクションの楽観的ロックであれば、「レコードロック
の解除待ち」を引き起こすことなく、ロールバックが可能です。
遅延トランザクションが発案された理由のひとつでもありますね。
投票数:0
平均点:0.00
pu_mahalo
居住地: 大阪
投稿数: 775
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
こんにちは Puです
ISHIJIMAさんのおっしゃるとおりです。
ロックを出来るだけ少なくしたいのなら
レコードロック無し、トランザクション無しで
一旦 memory table に集計し
正常に集計が終わったら
その後 memory tableから 実tblにupdate するとか
でわ〜でわ〜
ISHIJIMAさんのおっしゃるとおりです。
ロックを出来るだけ少なくしたいのなら
レコードロック無し、トランザクション無しで
一旦 memory table に集計し
正常に集計が終わったら
その後 memory tableから 実tblにupdate するとか
でわ〜でわ〜
投票数:0
平均点:0.00
ISHIJIMA
居住地: 静岡県
投稿数: 1827
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
物理トランザクションで
ロールバックするようにトランザクションをかけるのであればレコードロックは仕方がないではないでしょうか・・
レコードロックは発生させたくなくてロールバックする方法はないのでは・・
相反していませんか?
違っていたらすみません。
ロールバックするようにトランザクションをかけるのであればレコードロックは仕方がないではないでしょうか・・
レコードロックは発生させたくなくてロールバックする方法はないのでは・・
相反していませんか?
違っていたらすみません。
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
n_kawashimaさん
物理トランザクションでなく、遅延トランザクションを使ってみると
いいかもしれません。
遅延トランザクションでは悲観的ロックは発生しませんので、
レコードロックの解除待ちは起こりません。
ただし、プログラムの全体像が分かりませんので、それでうまく
行くという保証はいたしかねますが。
物理トランザクションでなく、遅延トランザクションを使ってみると
いいかもしれません。
遅延トランザクションでは悲観的ロックは発生しませんので、
レコードロックの解除待ちは起こりません。
ただし、プログラムの全体像が分かりませんので、それでうまく
行くという保証はいたしかねますが。
投票数:0
平均点:0.00
n_kawashima
投稿数: 21
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
Tandaさん
確かに、マイグレーションしたら、「タスク前の前」に
なっていた、という状況です。
ご指摘の通り、トランザクション「なし」とすればうまく
動作すると思いますが、集計処理中にエラーになったら
ロールバックするようにしたいです。
いろいろやってみてはいるのですが、F8チェックでエラーに
なったりしてうまくいきません。
Magic xpaでは、どのように指定すればよいのでしょうか。
ご教授の程よろしくお願い致します。
確かに、マイグレーションしたら、「タスク前の前」に
なっていた、という状況です。
ご指摘の通り、トランザクション「なし」とすればうまく
動作すると思いますが、集計処理中にエラーになったら
ロールバックするようにしたいです。
いろいろやってみてはいるのですが、F8チェックでエラーに
なったりしてうまくいきません。
Magic xpaでは、どのように指定すればよいのでしょうか。
ご教授の程よろしくお願い致します。
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
n_kawashimaさん
つまり、マイグレーション前はトランザクション「なし」になっていた
のが、マイグレーションしたら、「タスク前の前」になっていたという
状況でしょうか?
もしそうであれば、前の環境と同じようにトランザクション「なし」に
戻してみてはいかがでしょうか?
つまり、マイグレーション前はトランザクション「なし」になっていた
のが、マイグレーションしたら、「タスク前の前」になっていたという
状況でしょうか?
もしそうであれば、前の環境と同じようにトランザクション「なし」に
戻してみてはいかがでしょうか?
投票数:0
平均点:0.00
n_kawashima
投稿数: 21
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
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
よろしくお願い致します。
マイグレーション前のトランザクション指定は以下のとおりです。
各ツリーごとに記載します。
集計処理というのが親タスクで子タスクをコールしている
だけです。(タスク終了条件: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
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
n_kawashimaさん
マイグレーション前は、トランザクション開始はどこになって
おりましたか?
マイグレーション前は、トランザクション開始はどこになって
おりましたか?
投票数:0
平均点:0.00
n_kawashima
投稿数: 21
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
Tandaさん、早速のご回答ありがとうございます。
トランザクション開始が「タスク前の前」に指定している
のは意図的か?のご質問についてですが、意図的では
ありません。
Magic V8のプログラムでトランザクション指定していたのを
マイグレーションしたら「タスク前の前」になっておりま
したので、そのまま使用しておりました。
Magic V8で運用していたときのOracleのバージョンは10g
でしたが問題なく動作しておりました。
しかしながらMagic xpaではエラーとなってしまいます。
集計処理を実行中にエラーとなった場合、ロークバック
させたいのですが、その場合のトランザクション指定は
どのようにすればよいのでしょうか。
トランザクション開始が「タスク前の前」に指定している
のは意図的か?のご質問についてですが、意図的では
ありません。
Magic V8のプログラムでトランザクション指定していたのを
マイグレーションしたら「タスク前の前」になっておりま
したので、そのまま使用しておりました。
Magic V8で運用していたときのOracleのバージョンは10g
でしたが問題なく動作しておりました。
しかしながらMagic xpaではエラーとなってしまいます。
集計処理を実行中にエラーとなった場合、ロークバック
させたいのですが、その場合のトランザクション指定は
どのようにすればよいのでしょうか。
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
n_kawashimaさん、こんにちは。
集計処理プログラムのトランザクション開始が「タスク前の前」に
なっていますと、そのタスクで処理されるレコードのすべてにロック
が掛かりますが、それは意図した処理ですか?
つまり、そのタスクが終わるまで、そこで処理されるレコードのロック
は解除されない動作になります。
集計処理が単にデータの読み取りと計算だけの処理でしたら、
トランザクションは無くてもいいと思いますよ。
集計処理プログラムのトランザクション開始が「タスク前の前」に
なっていますと、そのタスクで処理されるレコードのすべてにロック
が掛かりますが、それは意図した処理ですか?
つまり、そのタスクが終わるまで、そこで処理されるレコードのロック
は解除されない動作になります。
集計処理が単にデータの読み取りと計算だけの処理でしたら、
トランザクションは無くてもいいと思いますよ。
投票数:1
平均点:10.00
n_kawashima
投稿数: 21
![半人前 半人前](../../uploads/rank3dbf8e94a6f72.gif)
お世話になります。
Magic xpa 2.3b PT3/Oracle12c でシステムを運用しています。
元々はMagic V8で動かしており、マイグレーションしたシステムです。
プログラムの修正は一切しておりません。
運用中にレコードロック解除待ちが多発して困っております。
プログラム内のトランザクションの設定がおかしいのではないかと思っているのですが、
実際のところどう修正すればよいのかわかりません。
いま現象が出ているプログラムの指定内容は以下のとおりです。
指示画面と集計処理が別プログラムで、指示画面から集計処理プログラムをプログラムコールしています。
集計処理プログラムでOracleのテーブルを更新しています。
集計処理プログラムは複数の子タスクがあり、トランザクションの指定がいろいろ混在しています。
指示画面プログラム(オンライン)
トランザクションモード P=物理
トランザクション開始 L=レコードロック時
キャッシュ範囲 N=なし
ロック方式 O=入力時
エラー発生時 A=アボート
集計処理プログラム(バッチ)
トランザクションモード P=物理
トランザクション開始 T=タスク前の前 と L=レコードロック時
ロック方式 I=即時
エラー発生時 A=アボート
ご教授の程よろしくお願い致します。
他にもOracleを使用した場合に注意すべき点がございましたら合わせてご教授頂ければ幸いです。
よろしくお願い致します。
Magic xpa 2.3b PT3/Oracle12c でシステムを運用しています。
元々はMagic V8で動かしており、マイグレーションしたシステムです。
プログラムの修正は一切しておりません。
運用中にレコードロック解除待ちが多発して困っております。
プログラム内のトランザクションの設定がおかしいのではないかと思っているのですが、
実際のところどう修正すればよいのかわかりません。
いま現象が出ているプログラムの指定内容は以下のとおりです。
指示画面と集計処理が別プログラムで、指示画面から集計処理プログラムをプログラムコールしています。
集計処理プログラムでOracleのテーブルを更新しています。
集計処理プログラムは複数の子タスクがあり、トランザクションの指定がいろいろ混在しています。
指示画面プログラム(オンライン)
トランザクションモード P=物理
トランザクション開始 L=レコードロック時
キャッシュ範囲 N=なし
ロック方式 O=入力時
エラー発生時 A=アボート
集計処理プログラム(バッチ)
トランザクションモード P=物理
トランザクション開始 T=タスク前の前 と L=レコードロック時
ロック方式 I=即時
エラー発生時 A=アボート
ご教授の程よろしくお願い致します。
他にもOracleを使用した場合に注意すべき点がございましたら合わせてご教授頂ければ幸いです。
よろしくお願い致します。
投票数:0
平均点:0.00