트랜잭션(Transaction):여러 SQL 작업을원자적으로 실행하며 전부 성공하면 커밋(Commit)하고 어느 한 곳이라도 실패하면 전체 롤백(Rollback)합니다. ACID 속성을 만족합니다.
.NET Framework/.NET 환경에서는 SqlTransaction(SQL Server 전용)을 사용해 구현합니다.
작업 흐름 핵심 포인트:
- 데이터베이스 연결 열기
conn.Open()- 연결을 통해 트랜잭션 시작
conn.BeginTransaction()- 트랜잭션 객체를
SqlCommand.Transaction에 바인딩- 여러 SQL 문을 일괄 실행
- 예외 없을 때:
tx.Commit();예외 포착 시:tx.Rollback()
예제 코드
원본 코드는 catch 롤백 로직이 빠져 있으니 완전 실행 가능 버전을 참고하세요:
public static int ExecuteSqlTran(List<string> SQLStringList)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction tx = conn.BeginTransaction();
cmd.Transaction = tx;
try
{
int count = 0;
for (int n = 0; n < SQLStringList.Count; n++)
{
string strsql = SQLStringList[n];
if (strsql.Trim().Length > 1)
{
cmd.CommandText = strsql;
count += cmd.ExecuteNonQuery();
}
}
tx.Commit(); // 전부 성공하면 트랜잭션 커밋
return count;
}
catch (Exception ex)
{
tx.Rollback(); // 하나라도 오류가 나면 전체 롤백
throw ex; // 상위 레벨에서 실패를 인지하도록 예외 재발생
}
}
}Code language: C# (cs)
이 버전은 SQL 문자열을 직접 이어 붙이기 때문에 SQL 인젝션 취약점이 존재합니다. 트랜잭션 원리 학습용으로만 쓰고 실제 프로젝트에서는 매개변수화 쿼리를 우선 사용하십시오.
매개변수를 적용한 트랜잭션 예시
SqlParameter로 인젝션을 막고 반복문으로 데이터를 삽입합니다. 주요 유의점:
- 반복문 마지막에
sqlCom.Parameters.Clear()를 호출해 이전 매개변수를 지워 매개변수 누적 오류를 방지 - 동일한
SqlCommand인스턴스를 재사용하고 CommandText와 매개변수만 갱신
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
SqlTransaction st = conn.BeginTransaction();
sqlCom.Transaction = st;
int res = 0;
try
{
for (int i = 0; i < 10; i++)
{
sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title])VALUES(@Title)";
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = i + "새 제목" + DateTime.Now;
sqlCom.Parameters.Add(param);
res += sqlCom.ExecuteNonQuery();
sqlCom.Parameters.Clear(); // 다음 순회를 위해 매개변수 초기화
}
st.Commit();
}
catch (Exception)
{
st.Rollback(); // 예외 발생 시 모든 변경 취소
}Code language: C# (cs)
1. 반드시 지켜야 하는 규칙
BeginTransaction()은연결 Open 이후에 호출해야 합니다SqlCommand객체에Transaction속성을 설정하지 않으면 예외가 발생합니다Commit()/Rollback()호출 후 트랜잭션은 자동 종료되므로 중복 호출할 수 없습니다
기타 참고사항
- .NET Core/.NET 5+에서는
using구문으로SqlTransaction을 자동 해제하는 것을 권장 - 대량 SQL 일괄 처리 환경에서는
SqlBulkCopy를 고려하십시오. 반복 ExecuteNonQuery보다 성능이 좋습니다 - 여러 데이터베이스를 아우르는 트랜잭션은 SqlTransaction으로 지원하지 않으며 분산 트랜잭션(
TransactionScope)을 사용해야 합니다
SqlTransaction 데이터베이스 트랜잭션
Previous: ExecuteNonQuery
Next: SqlDataReader