public class CustomerRepository
{
private readonly string connectionString;
public CustomerRepository(string connectionString)
{
this.connectionString = connectionString;
}
public void Add(Customer customer)
{
using (var connection = new SqlConnection(connectionString))
{
// 데이터베이스 작업 수행
// ...
}
}
}
[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.Serializable, TransactionTimeout = "00:00:30")]
public class CustomerService
{
private readonly CustomerRepository customerRepository;
private readonly OrderRepository orderRepository;
private readonly ProductRepository productRepository;
public CustomerService(string connectionString)
{
customerRepository = new CustomerRepository(connectionString);
orderRepository = new OrderRepository(connectionString);
productRepository = new ProductRepository(connectionString);
}
[OperationBehavior(TransactionScopeRequired = true)]
public void PerformTransactionalOperation()
{
using (var scope = new TransactionScope())
{
try
{
// Customer 추가 작업
customerRepository.Add(customer);
// Order 추가 작업
orderRepository.Add(order);
// Product 추가 작업
productRepository.Add(product);
// 모든 작업이 성공적으로 완료되면 트랜잭션 커밋
scope.Complete();
}
catch (Exception ex)
{
// 예외 처리
throw new FaultException($"{ex.Message}");
}
}
}
}
해당 방법으로 트랜잭션 처리시 잘 작동할까요?
제 생각에 리포지터리 안에서 using문으로 연결을 끊고 있어서 한 단위로 처리될 것 같아 보이지는 않는데,
트랜잭션 스코프를 정해주면 이 상황에서 한 단위로 작동이 되는건지 궁금합니다!
그러게 생각해보니 using문으로 끊고 있네