Forums: Open Discussion (Thread #19971)

トランザクション境界について (2008-09-22 16:20 by matsumotoa #38957)

ServerFWのブランクプロジェクトのトランザクション境界についてです。

現在配布されている設定では、以下のようになっています。
・ thin番
DAOのメソッド単位
 (例)
・ UpdateDAO.execute*
・ QueryDAO.execute*
・ rich版
*BLogic, *Serviceのメソッド単位
 (例)
・ TestBLogic.insert*
・ TestService.update*
・ TestService.*(readOnly)

ブランクのままならば、振る舞い(propagation設定)がREQUIREDであるため、(同一スレッド内で実行される)1ビジネスロジック、1トランザクションで実行されると思います。
しかし、その他の設定(REQUIRES_NEWなど)を行った場合、上記の境界では1ビジネスロジック、1トランザクションが保障されません。

上記を踏まえて、質問です。
この境界で、設定が行われている理由は何でしょうか?特に理由がないならば、利便性を考えるならば、ブランクのトランザクション境界をBLogic単位としておくべきではないでしょうか?

Reply to #38957×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: トランザクション境界について (2008-09-22 17:00 by kimuraku #38958)

DAOにもトランザクション境界を設けている理由は、業務要件によっては
ActionやControllerから直接DAOを呼び出さざるを得ない場合もあることを想定して、
トランザクションが全くかからなくなってしまう事態を防ぐためです。

もちろん開発時に適切なトランザクション境界とモードを設定すれば上記のような
事態は避けられますが、ブランクプロジェクトとして提供する上では
デフォルトの設定として以下を定義しておく方針にしています。
 ・DAOのトランザクション境界の定義
 ・BLogicのトランザクション境界の定義
 ・PROPERGATION=REQUIRED(これによりBLogicのトランザクション境界が優先される)

とはいえ現在のブランクプロジェクトの設定には、以下の問題がありますね。。。

 ・トランザクション対象のメソッドにexecute/insert/update/delete/selectが
  定義されているが、execute以外のメソッドはDAOにもBLogicにも存在しない。
 ・Web版のcommonContext.xmlがコメントアウトされているため、このままでは
  BLogicにトランザクションがかからない
 ・Rich版のDAOに対するトランザクションの設定がされていない。

開発時に必ず手が入る部分であるとは言え、推奨設定をした上で提供すべきだと思います。

次回リリース時に対応します。
Reply to #38957

Reply to #38958×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: トランザクション境界について (2008-09-22 17:13 by matsumotoa #38959)

kimurakuさま

早急な回答をありがとうございます。
DAO単位の境界設定の存在意義がよくわかりました。
DAO単位での(業務用件によりますが)propagation設定はREQUIREDが推奨ということですね。(REQUIRES_NEWにすると、ビジネスロジック内で1トランザクションにならないため)

基本、以下のような設定で運用しようと思います。
・QueryDAO.*→propagation=required, read-only=true
・UpdateDAO.*,StoredProcedureDAO.*→propagation=required, read-only=false

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


Reply to #38958

Reply to #38959×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: トランザクション境界について (2008-09-22 21:22 by yggd #38969)

誤解を招くかもしれませんので念のため・・・

TERASOLUNA(Spring)フレームワークの機能的な話題
として、「REQUIREDは推奨」という結論は正しくありません。

REQUIRED 以外のトランザクション属性を「使ってはいけない」、
あるいは「使ってもいいけどお勧めしない」という意味では
ないからです。
ましてや REQUIRES_NEW は、REQUIREDの代替でもありません。
# ご承知のこととは存じますが・・・

トランザクション属性で REQUIRED を使う機会は圧倒的に多い
のですが、この話題は特に概念的であるため、
当事者以外は混乱します。

説明としては、「1トランザクション境界内で実行するものは
REQUIRED を指定すること、REQUIRED を使わなくてはいけない」
くらいでよいと思います。



ところで、REQUIRED 以外にしなければならない
(言い換えるとトランザクション境界を別管理したい)
ケースが、業務要件としてどれほどあるのかがあまり
思いつきません。

「こういうときに、REQUIRED 以外にすることを検討した」
という話題は、意外と情報が不足しているので、
よろしければご教示いただければ幸いです。

(その少ない例ですが思いつくものとしては・・・)
実行ログをDBに吐く場合など、ビジネスロジック内の業務エラーによりロールバックした場合でも、
ログ出力は auto-commit のように振舞いたい、etc...
Reply to #38957

Reply to #38969×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: トランザクション境界について (2008-09-29 19:23 by matsumotoa #39069)

フォローありがとうございます。
現プロジェクトでは、各設定を承知の上でREQUIRED_NEWを
使用しています。


その「こういうときに、REQUIRED 以外にすることを検討した」についてです。
現在の案件では、以下の要件により、REQUIRED_NEWを使用しました。
・オンラインバッチ(サーバ上で動作するバッチ)で利用
・バッチにより処理されるデータは、他のWebAPからも参照されるが、その際にできる限り最新のデータを取得したいため、処理単位ごとにコミットする必要がある。
・バッチにより処理されるデータは、毎日更新されるが、エラーが出た場合でも正常処理された処理単位のデータはコミットしたい。

こんな感じです。
Reply to #38969

Reply to #39069×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login