私は2つのテーブルのお問い合わせと詳細を持っています。私はロールバックでC#
fbsave();
fbsavedetails();
を書かれているボタンをクリックして保存し
fbsave()
で は、照会テーブル内のデータを保存し、fbsavedetails()
は、詳細テーブル内のデータを保存します。
fbsavedetails()でエラーが発生した場合は、両方の手順をロールバックする必要があります。
は可能ですか?
私は2つのテーブルのお問い合わせと詳細を持っています。私はロールバックでC#
fbsave();
fbsavedetails();
を書かれているボタンをクリックして保存し
fbsave()
で は、照会テーブル内のデータを保存し、fbsavedetails()
は、詳細テーブル内のデータを保存します。
fbsavedetails()でエラーが発生した場合は、両方の手順をロールバックする必要があります。
は可能ですか?
Transaction
設定
using(var connection = ...)
{
connection.Open();
using (var tran = connection.BeginTransaction())
{
try
{
FBSave(connection, tran);
FBSaveDetails(connection, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
注、すなわち、その周りに渡すことができ
、およびすべてのコマンドは同じ接続オブジェクトになければなりません。
または、TransactionScope
を使用できます。
using(var tran = new TransactionScope())
{
FBSave();
FBSaveDetails();
tran.Complete();
}
か::TransactionScope
アプローチで
using(var tran = new TransactionScope())
using(var connection = ...)
{
connection.Open();
FBSave(connection);
FBSaveDetails(connection);
tran.Complete();
}
、あなたは特別な何かを設定する必要はありません - のほとんどはOpen()
自動入隊を取得するためにTransactionScope
内に起こることが重要ですそれは自動です。もちろん、オプションで接続をメソッドに渡すこともできますが、独自の接続を取得することもできます。ほとんどの場合、正常に動作します。
「自動入会を得るためにTransactionScopeを開いていますか?」はDTCの必要性を否定しますか? –
@MrMooseいいえ、通常は接続を渡すだけでDTCの必要性を回避することができます:もしTransactionMode内で1つの接続オブジェクトを使用すると、DTCではなくLTMによって処理されます(すべてのバージョンSQL Server 2005年版、IIRC) –
TransactionScopeを使用できます。
using(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
トランザクションスコープを完了しないと、ロールバックされます。
MS AccessまたはSQL Serverのように構成する必要がありますか? – andy
どのようにデータレイヤーを作成しますか?ストアドプロシージャ? linq-to-sql?接続?切断された? –
トランザクションを使用して、必要な処理を行うことができます。http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer