나는 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();
}
나 : Open()
가 TransactionScope
내부하면 자동으로 입대 얻기 위해 어떻게하는 것이 중요하다 TransactionScope
접근
using(var tran = new TransactionScope())
using(var connection = ...)
{
connection.Open();
FBSave(connection);
FBSaveDetails(connection);
tran.Complete();
}
을, 당신은 특별한 아무것도 설정할 필요가 없습니다 - 대부분의 자동입니다. 물론 선택적으로 메서드에 연결을 전달할 수는 있지만 자체 연결을 얻을 수도 있으며 대부분의 경우 제대로 작동합니다.
"자동 참여를 위해 TransactionScope를 열어"가 DTC의 필요성을 무효화합니까? –
@MrMoose 아니요.하지만 일반적으로 연결을 전달하면 DTC가 필요하지 않습니다. TransactionMode 내부에서 하나의 연결 개체 만 사용하는 경우 DTC 대신 LTM이 처리합니다 (모든 버전에서 SQL Server 2005 년, IIRC) –
TransactionScope를 사용할 수 있습니다.
using(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
트랜잭션 범위를 완료하지 않으면 롤백됩니다. DbTransaction 주위에 전달해야합니다
이 문제를
MS Access 또는 SQL Server를 구성 할 필요합니까? – andy
데이터 레이어는 어떻게합니까? 저장 프로 시저? linq-to-sql? 연결된? 연결이 끊어 졌습니까? –
트랜잭션을 사용하여 원하는대로 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer