SubSonic2.2 SharedDbConnectionScopeとのTransactionScopeトランザクション混乱
-
19-09-2019 - |
質問
なんてこった!!!
トランザクション内でご亜音速のクエリを包む有効にSharedDbConnectionScopeとのTransactionScopeオブジェクトを囲む少し混乱があるようです。
ドキュメントが使用してのTransactionScope ...
に巻き付け使用SharedDbConnectionScopeを指定することをお勧めusing(SharedDbConnectionScope scope = new SharedDbConnectionScope())
{
using(TransactionScope ts = new TransactionScope())
{
// do something
ts.Complete();
}
}
ここでそして、他の質問のようなサブソニック:一緒SharedDbConnectionScopeを使用してTransactionScopeのが壊れているように見えるとドキュメントが間違っていると2つのオブジェクトが他の方法で回避する必要があります示唆する ...
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の過負荷のために同じです!
しかし、ここでは本当のキッカーです...
彼らは他の方法の周りSharedDbConnectionScopeとのTransactionScopeを設定している以外!このはTransactionWithDtcOffTests.csコードではいくつかの素晴らしいテストを持っています
using(TransactionScope ts = new TransactionScope())
{
using(SharedDbConnectionScope connScope = new SharedDbConnectionScope())
{
// <snip />
}
}
私は亜音速の2.2用のテストを実行する機会がなかったが、私は、誰かが持っていると仮定して、彼らが渡さ..
を最後に... の
誰かが私SubSonic2.2のトランザクションを設定する方法に決定的な答えを与えることはできますか?ドキュメントは確かに間違っていますか? ExecuteTransactionオーバーロードとテストのためのソースが実際に正しい方ウェイに整列されていますか?
解決
SharedConnectionScope(SCS)ブロックのTransactionScope(TS)の内部でなければなりません。 SCSの目的は、可能な場合はMSDTCにトランザクションをエスカレート防ぐためですので、SCS使用してブロックの内部TS使用してブロックを持つことは私にはほとんど意味がありません。 トランザクションがコミットされるのいずれの場合も、すべてのTSブロックはコンプリート()の呼び出しを持っている必要があります。
他のヒント
個人的に私は、SQL 2005を使用している場合、SCSは、TS内でなければならないことがわかりました (MSDTCとの)SQL 2000を使用した場合と、SCSは、TSをラップする必要があります。 私はこのことができます願っています...