エラー後にコンテキストの状態をロールバックできるように、データコンテキストでトランザクションを使用できますか?もしそうなら、それはどのように機能しますか?
私はいつもテストにそれらを使用しています:)
try
{
dc.Connection.Open();
dc.Transaction = dc.Connection.BeginTransaction();
dc.SubmitChanges();
}
finally
{
dc.Transaction.Rollback();
}
[〜#〜] update [〜#〜]
これは、事後に常にロールバックされます。私はこれをテストに使用します。
DataContextはデフォルトでアンビエントトランザクションを取得するため、スコープ内にトランザクションがあることを確認するだけです。詳細が主な問題になります。
これは一部のプロトタイプコードを簡略化したもので、実際のコードはヘルパーを使用してポリシー駆動型オプションでトランザクションを作成します(プロトタイプの目的の1つは、これらのオプションの影響を調べることでした)。
using (var trans = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted
},
EnterpriseServicesInteropOption.Automatic)) {
// Perform operations using your DC, including submitting changes
if (allOK) {
trans.Complete();
}
}
Complete()が呼び出されない場合、トランザクションはロールバックされます。含まれているトランザクションスコープがある場合、データベースの変更をコミットするには、内部トランザクションと外部トランザクションの両方を完了する必要があります。
これはTransactionScopeメソッドほど単純ではありませんが、私が理解しているように、これはLINQ-to-SQLに対して行う「正しい」方法です。 System.Transactionsへの参照は必要ありません。
dataContext.Connection.Open();
using (dataContext.Transaction = dataContext.Connection.BeginTransaction())
{
dataContext.SubmitChanges();
if (allOK)
{
dataContext.Transaction.Commit();
}
else
{
dataContext.Transaction.RollBack();
}
}
もちろん、RollBackは、を使用してさらにデータ操作を行う場合にのみ必要です。それ以外の場合、変更は自動的に破棄されます。
このようなもの、おそらく:
try
{
using (TransactionScope scope = new TransactionScope())
{
//Do some stuff
//Submit changes, use ConflictMode to specify what to do
context.SubmitChanges(ConflictMode.ContinueOnConflict);
scope.Complete();
}
}
catch (ChangeConflictException cce)
{
//Exception, as the scope was not completed it will rollback
}
このようなものです:
using (YourDatacontext m_DB = new YourDatacontext()) using (TransactionScope tran = new TransactionScope()) { try { //make here the changes m_DB.SubmitChanges(); tran.Complete(); } catch (Exception ex) { Transaction.Current.Rollback(); } }