- PR -

C#2003で異なるDllを1トランザクションでDB書き込みを行う

1
投稿者投稿内容
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 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処理を行う

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-01-17 20:57
コネクションやトランザクションを引数で引き回すのが許容範囲なら、
単純に引数でコネクションやトランザクションを渡してやればいいのでは?
ていうか書き込みのコードは何なんでしょう?
※現在のコード?こんな感じでできるかな?というコード?

コネクションを引き回すのはいやだが、分散トランザクションを使えるなら
System.EnterpriseServices.ServiceDomain

それはちょっと…なら独自のトランザクション&コネクション管理クラスを
作成するしかないですかね…
引数で引き回したくないならTLSを使うとか方法はありますが、
若干面倒かもしれません(サポートする機能によりますが)。
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-01-17 22:28
私はコネクションとトランザクションを管理するクラスを
シングルトンとして用意する設計で対応しています。

複数Dllに更新処理が分散する際は、今のところ一番実装しやすく
扱いやすい、という個人的な気持ちです。
やることは引数による受け渡しとそう大差ないので
「自前で用意する」ならば悪くないと思いますよ。

EnterpriseServiceとかは「自前で用意するより信頼度が高い」というメリットが
ありますので、そのあたりは色々考慮されるといいかと思います。
匿名希望
常連さん
会議室デビュー日: 2006/12/12
投稿数: 23
投稿日時: 2007-01-19 10:53
返信遅くなり申し訳ございません
ただいま、トランザクションの受け渡しを行うことで調査中です
自分でそーいったクラスを作成しようと思っています
1

スキルアップ/キャリアアップ(JOB@IT)