- - PR -
C#2003で異なるDllを1トランザクションでDB書き込みを行う
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-01-17 20:33
C#2003でデータベース操作をしているのですが、大きな壁に当たってしまい
御教授いただければ幸いです ソリューションには、「T.exe」、「I1.dll」、「I2.dll」、「I3.dll」の 4プロジェクト(1exe、3dll)が存在しています T.exeからI1.dll、I2.dll、I3.dllの順で呼び出します 呼び出されたI1、I2、I3はDB2のそれぞれのテーブルにレコードをInsert処理を行う といったプログラムなのですが 行いたいことは、I1、I2、I3を1トランザクションとして処理を行いたいという点です T1のInsert・・・○ T2のInsert・・・○ T3のInsert・・・× だったときに、T1、T2でInsertしたレコードを取りやめたい(ロールバック)と思っています 可能でしょうか? またどのようにすれば宜しいでしょうか? 出来れば、失敗した場合は、T1、T2のレコードをDeleteするのではなく、ロールバックで対応 せざるえない状況になっています データベースへの接続は、DB2Client経由です T.exe try{ トランザクション開始 I1.dllのI1メソッドを実行 I2.dllのI2メソッドを実行 I3.dllのI3メソッドを実行 I1をコミット I2をコミット I3をコミット }catch{ I1、I2、I3をロールバック } I1.dll I1メソッド 処理:I1テーブルへInsert処理を行う I2.dll I2メソッド 処理:I2テーブルへInsert処理を行う I3.dll I3メソッド 処理:I3テーブルへInsert処理を行う |
|
投稿日時: 2007-01-17 20:57
コネクションやトランザクションを引数で引き回すのが許容範囲なら、
単純に引数でコネクションやトランザクションを渡してやればいいのでは? ていうか書き込みのコードは何なんでしょう? ※現在のコード?こんな感じでできるかな?というコード? コネクションを引き回すのはいやだが、分散トランザクションを使えるなら System.EnterpriseServices.ServiceDomain それはちょっと…なら独自のトランザクション&コネクション管理クラスを 作成するしかないですかね… 引数で引き回したくないならTLSを使うとか方法はありますが、 若干面倒かもしれません(サポートする機能によりますが)。 |
|
投稿日時: 2007-01-17 22:28
私はコネクションとトランザクションを管理するクラスを
シングルトンとして用意する設計で対応しています。 複数Dllに更新処理が分散する際は、今のところ一番実装しやすく 扱いやすい、という個人的な気持ちです。 やることは引数による受け渡しとそう大差ないので 「自前で用意する」ならば悪くないと思いますよ。 EnterpriseServiceとかは「自前で用意するより信頼度が高い」というメリットが ありますので、そのあたりは色々考慮されるといいかと思います。 |
|
投稿日時: 2007-01-19 10:53
返信遅くなり申し訳ございません
ただいま、トランザクションの受け渡しを行うことで調査中です 自分でそーいったクラスを作成しようと思っています |
1