try catch를 사용하여 BeginTransaction을 사용하는 가장 깨끗한 방법

Jan 27 2021

지금까지 쿼리에 대해 두 개의 try catch 블록을 사용하고 있습니다. 첫 번째는 연결이 설정되지 않은 경우 오류를 발생시킵니다. 두 번째 SqlCommand는 성공적으로 실행되었는지 확인합니다 . 아래 예와 같이

try
{
  using(varconnection=newSqlConnection())
  using(varcmd=newSqlCommand())
  {
  
    connection.Open();
    var transaction=connection.BeginTransaction();
    cmd.Connection=connection;
    cmd.Transaction=transaction;

    try
    {
     cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
     cmd.ExecuteNonQuery();

     cmd.CommandText="InsertintoCustomers(Name)values('George')";
     cmd.ExecuteNonQuery();

     transaction.Commit();
   }
   catch
   {
     try{transaction.Rollback();}catch{}
   }
  }
}
catch
{

}

더 명확 해 보이는 두 번째 예제를 찾았습니다.

SqlTransactiontransaction=null;
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
   try
   {
   connection.Open();
   transaction=connection.BeginTransaction();
   cmd.Connection=connection;
   cmd.Transaction=transaction;

   cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
   cmd.ExecuteNonQuery();

   cmd.CommandText="InsertintoCustomers(Name)values('George')";
   cmd.ExecuteNonQuery();

   transaction.Commit();
   transaction.Dispose();
   transaction=null;
}
catch
{
   if(transaction!=null)
   {
      try{transaction.Rollback();}catch{}
   }
 }
}

둘 다 동일한 결과를 가지고 있습니까? 두 가지 중 어느 것이 더 바람직합니까?

답변

2 Charlieface Jan 28 2021 at 00:18

이 두 가지 방법 중 어느 것도 좋지 않습니다. 너무 장황합니다.

가장 좋은 방법은 단지를 배치하는 것입니다 TransactionA의 using또한 우리가 쿼리에 대한 매개 변수를 사용해야합니다,뿐만 아니라 :

using(var connection = new SqlConnection(connString))
using(var cmd = new SqlCommand("Insert into Customers (Name) values (@Name));"))
{
    var param = cmd.Parameters.Add("@Name", SqlDbType.VarChar, insert_column_length_here);
    connection.Open();
    using(var transaction = connection.BeginTransaction())
    {
        cmd.Transaction = transaction;
        param.Value = "Dimitri";
        cmd.ExecuteNonQuery();

        param.Value = "George";
        cmd.ExecuteNonQuery();

        transaction.Commit();
    }
}

트랜잭션 객체를 폐기 하면 소스 코드를 살펴보면 아직 커밋되지 않은 경우 자동으로 롤백됩니다 . 그래서 using모든 것을 정리할 것입니다.

사용자에게 메시지를 표시하기 위해 포착해야하는 경우 코드 외부 에서 수행합니다. 즉 try/catch, 전체를 둘러 쌉니다. 정리 코드를 직접 수행하지 마십시오.