2012-12-19 2 views
9

나는 2 개의 테이블 조회 및 세부 사항이있다. 저장 버튼에 내가롤백 C#

fbsave(); 
fbsavedetails(); 

fbsave()이 조회 테이블의 데이터를 저장하고 fbsavedetails() 세부 테이블에 데이터를 저장 쓴 클릭합니다.

이제 fbsavedetails()에 오류가 발생하면 두 단계 모두 롤백해야합니다.

가능합니까?

+0

MS Access 또는 SQL Server를 구성 할 필요합니까? – andy

+2

데이터 레이어는 어떻게합니까? 저장 프로 시저? linq-to-sql? 연결된? 연결이 끊어 졌습니까? –

+0

트랜잭션을 사용하여 원하는대로 할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer

답변

8
명시 적 트랜잭션을 생성하고 당신이 그것을에 전달해야하므로 왜 여기 당신이 해야 또한 각 명령에 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(); 
} 

을, 당신은 특별한 아무것도 설정할 필요가 없습니다 - 대부분의 자동입니다. 물론 선택적으로 메서드에 연결을 전달할 수는 있지만 자체 연결을 얻을 수도 있으며 대부분의 경우 제대로 작동합니다.

+0

"자동 참여를 위해 TransactionScope를 열어"가 DTC의 필요성을 무효화합니까? –

+0

@MrMoose 아니요.하지만 일반적으로 연결을 전달하면 DTC가 필요하지 않습니다. TransactionMode 내부에서 하나의 연결 개체 만 사용하는 경우 DTC 대신 LTM이 처리합니다 (모든 버전에서 SQL Server 2005 년, IIRC) –

7

TransactionScope를 사용할 수 있습니다.

using(var scope = new TransactionScope()) 
{ 
    //Complete the transaction only when both inserts succeed. 
    scope.Complete(); 
} 

트랜잭션 범위를 완료하지 않으면 롤백됩니다. DbTransaction 주위에 전달해야합니다

1

이 문제를

  1. 사용 DbTransaction을 해결하고이 방법을 주위에 DbTransaction을 통과 오류가 양론이 일어난 경우 성공과 롤백이 경우 트랜잭션을 커밋하는 방법은 두 가지가 있습니다.
  2. 사용하여 TransactionScope 장점 : 단점 사용하여 쉽게 액세스가 지원되지 않습니다, 데이터베이스가 SQL2000 경우, MSDTC는