문제

가장 좋은 방법은 무엇을 트랜잭션에서는 C#.Net2.0.무엇이 있는 클래스를 사용되어야 하는가?는 함정이 무엇인지를 위해 밖을 봐 etc.모든 것을 투입하고 rollback 물건입니다.나는 그냥 시작하는 프로젝트 수 할 필요가 일부 거래를 하는 동안 데이터를 삽입하 DB.어떤 응답하거나 링크에 대한 기본적인 물건에 대한 트랜잭션을 환영합니다.

도움이 되었습니까?

해결책

2 종류가 있의 트랜잭션연결 거래 및 주변 트랜잭션이 있습니다.에 연결 트랜잭션(예:SqlTransaction)에 직접 연결로 db 연결을(등렇게 하려면 다음과 같이)즉,당신은 유지하는 통과 연결의 주위에-에서 확인이 어떠한 경우에는,그러나 수 없도록 만들기"사용//출시"사용을 허용하지 않는 십자가는 db 작업이다.예(포맷을 위한 공간):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

너무 더러운,그러나 제한을 우리의 연결"conn".우리가 원하는 경우를 부르는 다른 방법을 우리는 지금 전달해야"conn"니다.

대체는 주변의 트랜잭션새로운습니다.NET2.0 TransactionScope 체(System.Transactions.dll)을 사용할 수 있는 범위에서 작업(적당한 공급자를 자동으로 참여서 주변에 트랜잭션).이것은 쉽게 복고풍에 맞는 기존하는(비-트랜잭션)코드,그리고 이야기하는 여러 공급자로더(DTC 참여하는 경우에 당신은 이야기는 하나 이상의).

예를 들어:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

참고 여기에는 두 가지 방법을 처리할 수 있는 자신의 연결(열어/사용/닫기/dispose),아직 그들은 자동으로 된 부분의 주위의 거래 없이 우리에게는 아무것도 전달합니다.

면 코드에 오류 처리하십시오()호출 할 것 없이 완료(),그래서 그것을 것입니다.예상 중첩 등을 지원할 수 있지만,없는 목록-다 내부 거래가 아직 완료 외부 트랜잭션:다면 사람들은 불행하고,트랜잭션이 중단되었습니다.

의 다른 장점 TransactionScope 은 그것에 묶이지 않을 데이터베이스어떤 트랜잭션을 알고 업체로 사용할 수 있습니다.WCF,예를 들어.거나 심지어 일부 TransactionScope 호환 개체형(i.e.NET 클래스로 롤백 기능이-아마 보다 쉽게 기념하지만,나는 결코 사용되는 이 방법을 자).

모두 모두,매우 매우 유용한 객체입니다.

몇 가지 유의할 사항:

  • SQL Server2000,TransactionScope 갈 것이다 DTC 즉시;이에서 SQL Server2005 위를 사용할 수 있 성남 담당(훨씬 적은 오버헤드)할 때까지는 이야기 2 원 등을 때,그것은 상승하 DTC.
  • 결함 는 의미할 수 있습을 조정할 필요 연결 문자열

다른 팁

protected void Button1_Click(object sender, EventArgs e)
   {


       using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"))
       {
           connection1.Open();

           // Start a local transaction.
           SqlTransaction sqlTran = connection1.BeginTransaction();

           // Enlist a command in the current transaction.
           SqlCommand command = connection1.CreateCommand();
           command.Transaction = sqlTran;

           try
           {
               // Execute two separate commands.
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('a','b','c')";
               command.ExecuteNonQuery();
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('x','y','z')";
               command.ExecuteNonQuery();

               // Commit the transaction.
               sqlTran.Commit();
               Label3.Text = "Both records were written to database.";
           }
           catch (Exception ex)
           {
               // Handle the exception if the transaction fails to commit.
               Label4.Text = ex.Message;


               try
               {
                   // Attempt to roll back the transaction.
                   sqlTran.Rollback();
               }
               catch (Exception exRollback)
               {
                   // Throws an InvalidOperationException if the connection 
                   // is closed or the transaction has already been rolled 
                   // back on the server.
                   Label5.Text = exRollback.Message;

               }
           }
       }


   }

당신은 또한 포장의 트랜잭션으로 자신의 저장된 절차 및 처리하는 방법 대신 트랜잭션에서는 C#다.

DB 관련 물건에 필요한 경우 일부 또는 맵퍼 (예 : Nhibernate)는 기본적으로 상자에서 트랜스 팩 티노를 지원합니다.

또한 필요한 것에 따라 다릅니다. 기본 SQL 트랜잭션의 경우 Code에서 시작 및 커밋 트랜스를 사용하여 TSQL 트랜잭션을 수행 할 수 있습니다. 그것은 가장 쉬운 방법이지만 복잡성이 있으며 제대로 커밋해야합니다 (및 롤백).

나는 같은 것을 사용할 것입니다

SQLTransaction trans = null;
using(trans = new SqlTransaction)
{
    ...
    Do SQL stuff here passing my trans into my various SQL executers
    ...
    trans.Commit  // May not be quite right
}

모든 실패는 바로 당신을 튀어 나옵니다 using 그리고 거래는 항상 커밋되거나 롤백됩니다 (당신이 말하는 것에 따라). 우리가 직면 한 가장 큰 문제는 그것이 항상 헌신적인지 확인하는 것이 었습니다. 사용은 트랜잭션의 범위가 제한되어 있는지 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top