:処理された例外を持つC#トランザクションはロールバックされますか?コードのこの部分を考慮すると
using(TransactionScope tran = new TransactionScope()) {
insertStatementMethod1();
insertStatementMethod2();
// this might fail
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
tran.Complete();
}
はロールバックされようとしてinsertStatementMethod1
とinsertStatementMethod2
で行うものですか?いかなる場合でも? とにかく実行したい場合は、取引前にinsertStatementMethod3
が失敗するかどうかを確認し、それに基づいてトランザクションコードを作成する必要がありますか?
更新
コードは、私が唯一yourExtraCode()
メソッドを編集することができますので、私はできませんyourExtraCode()
方法
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
insertStatementMethod3();
}
を書くために得るこの
using(TransactionScope tran = new TransactionScope()) {
// <standard code>
yourExtraCode();
// <standard code>
tran.Complete();
}
に似ていますトランザクションのスコープにするかどうかを選択します。一つの簡単な可能な解決策は、このようになります:
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
if (findOutIfIcanInsert()) { // <-- this would come by executing sql query
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
}
}
しかし、それは、パフォーマンスに影響を与えるデシベルで物事を見ての必要性が付属しています。 より良い方法がありますか、方法を呼び出す前に調べる必要がありますか? 私は試してみましたが、もちろんトランザクションは期待通りにロールバックされました。
これを確認してください。http://stackoverflow.com/questions/494550/how-does-transactionscope-roll-back-transactions –
実際には、アンビエントトランザクションに参加しないことを選択する可能性があります。下の回答を参照してください。 –