C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 自動Transactionの共有について


(過去ログ 92 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54975 / inTopicNo.1)  自動Transactionの共有について
  
□投稿者/ Zero (1回)-(2010/11/12(Fri) 00:50:10)

分類:[C#] 

お疲れ様です。
VS2008, C#, SQLServer2005 で開発しています。

自動トランザクションの共有についてなのですが、現在以下のように root をルートに、
scope2 以降のトランザクションを入れ子にした一つの処理を作成しています。
入れ子の方の TransactionScopeOption を Required か RequiresNew にすると、「基本トランザクションマネージャとの通信が失敗しました」と
エラーが表示されます。(MSDTCの環境が変更できないPCで動作することもあるので、環境に関してはスルーして頂けると助かります)
が、 Suppress にすると問題なく動作します。
Suppress と Required は用途が違うだけで同じルートとの共有をしていると思うのですが、この動作の違いは何なのでしょうか?
また、 Suppress はデータアクセス処理の場合使わない方が良い、と聞いたので、できれば Required の方で処理を行いたいと思っています。
どなたかご教授お願いいたします。

using(TransactionScope root = new TransactionScope(TransactionScopeOption.RequiresNew))
{
処理1();

処理2();

root.Complete();
}

private void 処理1()
{
using(TransactionScope scope1 = new
TransactionScope(TransactionScopeOption.Suppress))
{
...
scope1.Cmplete();
}
}

private void 処理2()
{
using(TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress))
{
...
scope2.Complete();
}
引用返信 編集キー/
■54976 / inTopicNo.2)  Re[1]: 自動Transactionの共有について
□投稿者/ 囚人 (562回)-(2010/11/12(Fri) 01:18:01)
>Suppress と Required は用途が違うだけで同じルートとの共有をしていると思うのですが

全然違いますよ。Suppress は「トランザクションなし」です。要は Suppressで仮に失敗しても、親のトランザクションには影響しません。Required は親のトランザクションに参加します。

「環境はスルーで」との指示ですが、ま、要するにMSDTCが動いていないのではないかと。

http://msdn.microsoft.com/ja-jp/library/ms172152(v=VS.80).aspx

引用返信 編集キー/
■54979 / inTopicNo.3)  Re[2]: 自動Transactionの共有について
□投稿者/ Zero (2回)-(2010/11/12(Fri) 10:54:34)
No54976 (囚人 さん) に返信
ご返信ありがとうございます。
> >Suppress と Required は用途が違うだけで同じルートとの共有をしていると思うのですが
>
> 全然違いますよ。Suppress は「トランザクションなし」です。要は Suppressで仮に失敗しても、親のトランザクションには影響しません。Required は親のトランザクションに参加します。
Transaction の Supporetd と勘違いして覚えていました。そりゃ違う動作しますよね・・・。
> 「環境はスルーで」との指示ですが、ま、要するにMSDTCが動いていないのではないかと。
開発環境でデバッグが回らないと、ということで一応環境設定はしているのですが、
(ファイアーウォール停止、Distributed Transaction Coordinator 起動、MSDTCのセキュリティ構成で送受信を許可・認証を必要としない、pingでサーバーとの相互通信確認)
エラーが起こったと思ったら、時間置いたら成功したり、でどういう訳か安定しないので、
コード側で解決しようと思っています。
引用返信 編集キー/
■55004 / inTopicNo.4)  Re[3]: 自動Transactionの共有について
□投稿者/ なちゃ (476回)-(2010/11/13(Sat) 11:36:48)
No54979 (Zero さん) に返信
> コード側で解決しようと思っています。

無理です。
分散トランザクションなしでは、SQL Sever 2005 の場合実現できません。

SQL Sever 2008 以降なら分散トランザクションなしでも共有できるようになりました。
もちろん同一接続文字列でなければなりませんが。
.NET Framework も 2.0 SP1 以降が必要だったと思いますが、今なら普通はなってるでしょう。

引用返信 編集キー/
■55005 / inTopicNo.5)  Re[4]: 自動Transactionの共有について
□投稿者/ なちゃ (477回)-(2010/11/13(Sat) 13:50:09)
ちょっと補足。

No55004 (なちゃ さん) に返信
> ■No54979 (Zero さん) に返信
>>コード側で解決しようと思っています。
>
> 無理です。
> 分散トランザクションなしでは、SQL Sever 2005 の場合実現できません。

もちろん、単一のDB接続をうまく持ち回って使うなどの仕組みを作って
それを確実に使うように各処理を記述するなら出来なくはありませんが、
今まで通りの接続の扱いのままでは無理ということです。


SQL Sever 2008 に出来るなら一番簡単だと思うんですけどね。

引用返信 編集キー/
■55006 / inTopicNo.6)  Re[5]: 自動Transactionの共有について
□投稿者/ Zero (3回)-(2010/11/13(Sat) 23:50:30)
No55005 (なちゃ さん) に返信

> もちろん、単一のDB接続をうまく持ち回って使うなどの仕組みを作って
> それを確実に使うように各処理を記述するなら出来なくはありませんが、
> 今まで通りの接続の扱いのままでは無理ということです。

サーバーへの問い合わせを分散させず一つに纏める、ということですか。
今の私の技量では難しいですが、なんとか頑張ってみます。

囚人様、なちゃ様、ご返信ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -