C# 에서 Transaction 처리 할때요...
처리해야 하는 DB작업이 4가지 있고 이 4가지를 각각 다른 함수로 만들었어요.
그런데 이 4가지 작업을 하나의 트랜잭션으로 묶어야 하죠.
그래서 전 아래와 같이 코딩을 했습니다.
//////////////////////////////////////////////////////////////////////////
class Test : Form
{
Conncection conn = new Connection(ConnectionString);
Transaction tran = null;
Test_load()
{
conn.open();
this.tran = conn.BeginTransaction();
try
{
FuncA();
FuncB();
FuncC();
FuncD();
}
catch(Exception ex)
{
this.tran.Rollback();
}
finally
{
this.conn.close()
}
}
void FuncA()
{
string sql = "select....."; // Insert, Update 쿼리문
Command cmd = new Command(sql, this.conn)
cmd.transaction = this.tran;
try
{
if (this.conn.State == ConnectionState.Closed) this.conn.Open();
cmd.execute(); // executeNonQuery, executeDataReader 구문
}
catch(Exception ex)
{
throw ex;
}
finally
{
}
}
void FuncB(){} // FuncA 와 같은 형태
void FuncC(){} // FuncA 와 같은 형태
void FuncD(){} // FuncA 와 같은 형태
}
//////////////////////////////////////////////////////////////////////////
이렇게 하면 프로그램이 돌아가긴 하는데.. 왠지 뭔가 석연치가 않습니다.
FuncA 함수가 개별적으로 쓰일경우,
1. Finlly 에서 this.conn.close() 를 호출하기가 모호해지죠. this.conn.close() 를 호출하면
transaction이 깨질 수 있으니까요. this.conn.close() 를 호출 안하자니 뭔가 찜찜하고..
2. cmd.transaction = this.tran; 구문도 필요없는 문장이 되는데.. 이것도 찜찜해요..
결국 FuncA,B,C,D 함수는 뭔가 트랜잭션으로 묶여지기 위한 형태로 보인다고 해야될까?
개별적으로 사용해도 되는지 거시기하고..
뭔가 깔끔하게 코딩하는 방법 없을까요? 다른분들은 어떻게들 하시는지 궁금해서요..
어떤분은 Connection pool 을 쓰라고 하는데 어떻게 하라는건지 잘 모르겠어요..
C# 에서 Connection pool 을 사용하는 기법은 어디서 볼수 있나요?
댓글 달기