트랜잭션이 발생할 경우 개체에 접근할 수 없는 것을 블로킹이라고 함
만약 트랜잭션을 끝내지 않아 무한대로 기다리는 상황이 생길 수 있어 이것을 막기위해 타임아웃 옵션을 설정할 수 있음
select @@LOCK_TIMEOUT 로 조회 가능하며 -1 일 경우 무한대로 대기함
exec sp_who 프로시저로 블로킹 중인 프로세스 확인이 가능하며 kill프로세스로 해당 프로세스를 중단시킬 수 있음
set lock_timeout 1000 식으로 설정 가능하며 단위는 밀리초 이므로 1000 = 1초 임
타임아웃이 지난다고 트랜잭션이 취소되는 것은 아니며, 잠금이 걸린 데이터에 접근하는 쿼리를 취소하는 것임
두 잠금이 서로 상대가 풀리도록 대기하는 상태를 교착상태라고 함
서로 풀릴때까지 기다리느라 무한대로 멈추어야하지만 sql server에서 이런 상황을 자동으로 검색하여 한쪽을 희생시켜 해결 함 (검색 주기 디폴트 5초)
이 또한 시스템 자원을 소모하므로 성능을 위해 이런 상황을 만들지 않는게 좋음
되도록 트랜잭션 격히 수준을 read committed로 두고 하나의 트랜잭션에 너무 많은 쿼리를 넣지 않아야 함
분산 트랜잭션
서로 다른 서버에서 하나의 트랜잭션으로 데이터를 처리하는것
개념적으로는 하나의 트랜잭션이며 서버가 분리되어있다는 것만 차이 있음
begin tran 대신 begin distributed transaction을 사용하며 커밋은 동일하게 commit tran을 사용
분산 트랜잭션을 사용할떄는 xact_abort 옵션을 on으로 설정해야함
xact_abort를 on으로 설정하면 하나의 트랜잭션이 오류를 일으키면 전체 트랜잭션을 취소하므로 분산 트랜잭션에서는 꼭 ON으로 설정해야함 디폴트는 OFF임
또한 분산 트랜잭션을 사용하기 위해서는 MS DTC가 설치되고 가동되고 있어야 함