3

ARGH !!!SubSonic2.2 SharedDbConnectionScopeとTransactionScopeトランザクションの混乱

SharedDbConnectionScopeとTransactionScopeオブジェクトを取り巻く混乱があり、トランザクション内でSubSonicクエリをラップすることができないようです。

ドキュメントは、ここでは、そのようなSubsonic: Using SharedDbConnectionScope together with TransactionScope seems to be brokenとして

using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
{ 
    using(TransactionScope ts = new TransactionScope()) 
    { 
    // do something 
    ts.Complete(); 
    } 
} 

その後、他の質問は、ドキュメントが間違っていると2つのオブジェクトが他の方法で回避する必要があります示唆...使用のTransactionScopeに巻き付け使用SharedDbConnectionScopeを指定することをお勧め..

using(TransactionScope ts = new TransactionScope()) 
{ 
    using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
    { 
    // do something 
    ts.Complete(); 
    } 
} 

しかし、ソースコードを見ると、私はさらに混乱しています。

SqlQuery.csコードファイルには、多数のExecuteTransactionオーバーロードがあります。たとえば...

public static void ExecuteTransaction(List<SqlQuery> queries) 
{ 
    using(SharedDbConnectionScope scope = new SharedDbConnectionScope()) 
    { 
    using(TransactionScope ts = new TransactionScope()) 
    { 
     foreach(SqlQuery q in queries) 
     q.Execute(); 
    } 
    } 
} 

うーん興味深い...どこts.Completeは()を呼び出します... がドキュメントにマッチしますが?

どのようにトランザクションをコミットする必要がありますか?私が見る限り、常にロールバックされます。そして、すべてのExecuteTransactionオーバーロードで同じです! TransactionWithDtcOffTests.csコードで

しかし、ここで本当のキッカーはある...

は、他の方法で回避SharedDbConnectionScopeとのTransactionScopeを設定している以外いくつかの素晴らしいテストを持っています!

using(TransactionScope ts = new TransactionScope()) 
{ 
    using(SharedDbConnectionScope connScope = new SharedDbConnectionScope()) 
    { 
    // <snip /> 
    } 
} 

最後に

...

は、誰かが私を与えることができます..私は亜音速の2.2用のテストを実行する機会がなかったが、私は誰かが持っていると仮定し、彼らが渡されましたSubSonic2.2での取引をどのように設定すべきかについての明確な答え?ドキュメントは本当に間違っていますか? ExecuteTransactionのソースが過負荷になっていて、実際に正しい方法でテストが行​​われていますか?

+0

私は問題に従うことができません - ここに約3があります。私はあなたがイライラしていることを理解しています:)しかし、あなたがバグだと思っているものと何が混乱しているのかは分かりません。 –

+0

SharedDbConnectionScope(SDCS)とTransactionScope(TS)の順序は混乱しているか、またはバグのビットです。 docs状態SDCSはTSをラップします。しかし、それは動作していないようです。だからバグです。 ExecuteTransactionのオーバーロードでは、SDCSがTSをラッピングするため、バグでもあります。私は実際にコミットされた場所で過負荷がどこにあるのか分からなかったが、バグとは対照的に十分には見えなかったためかもしれない。私が調べたテストコードには、SDCSをラップするTSがありました。だから私はバグではないと結論づけている。 混乱しているビットはエラーの場所です。 – BlackMael

+0

SDCSとTSの順序がエラーであるか、SDCS自体のエラーであり、ドキュメント内の順序が正しいかどうか。 今、TSラッピングを貼っているので、SDCSは私のために働きます。ここで、TSをラッピングするSDCSは、必要な時にはロールバックすることができませんでした。 – BlackMael

答えて

4

SharedConnectionScope(SCS)ブロックは、TransactionScope(TS)内に存在する必要があります。 SCSの目的は、できるだけトランザクションをMSDTCにエスカレートさせないようにすることです。そのため、ブロックを使用してSC内のブロックを使用しているTSにはほとんど意味がありません。 いずれの場合でも、トランザクションがコミットされるためには、すべてのTSブロックにComplete()コールが必要です。

0

SQL 2005を使用する場合、SCSはTS 内になければならず、SQL 2000(MSDTC付き)を使用する場合、SCはTSをラップする必要があることがわかりました。 これが役に立ったら...