안녕하십니까. 신입 PG입니다!
다름이 아니오라, 한가지 궁금증이 생겻습니다.
일반적으로 쿼리 상에 Begin Tran, Commit Tran 을 사용하여 값을 저장합니다.
트랜잭션 루틴을 탈경우, 해당되는 테이블들이 모두 잠긴다고 알고 있습니다. 트랜잭션이 끝날 때 까지말이죠.
그런데, 트랜잭션 루틴을 수행하는 도중에 테이블 전체에 Rock 이 걸리지 않고,
부분적으로 Rock을 거는 방법 있지 않을까 하는 의문이 생겼습니다.
물론 사용 되는 키들은 접근이 불가능 하겟지만, 일반 컬럼에는 접근 할 수 있지 않을까요?
예 )
DATATABLE{
FACTGB 컬럼1 ┐
DATE 컬럼2 │ Primary key
PASS 컬럼3 ┘
NAME 컬럼4 - Normal column
}
다음과 같은 테이블에서
(어떠한 방식 적용)
begin tran
insert into DATATABLE values(FACTGB, DATE, PASS, NAME)
(1)
select * from DATATABLE
commit tran
Q1. (1)의 타이밍에 Name 에 일반적인 동시 접근이 되게 하는 방법(부분 Rock?의 개념)
Q2. 안된다면, 그 이유를 말씀해주셧으면 좋겟습니다.
*원자성, 일관성, 격리성 을 회유하는 방식
Comment 2
-
메칸더
2013.06.04 10:56
-
쓸만한게없네(윤선식)
2013.06.04 12:49
우선...Rock이 아니고 Lock입니다. MSDN 한국어 버전에서는 일반적으로 잠금이라고 표현합니다.
(1)의 상황일때 아직 커밋이 되지 않았을때 읽는 방법은 간단합니다.
방법1
SELECT * FROM DATATABLE (WITH NOLOCK) --노락옵션을 주어서 커밋되지 않은 테이블을 읽는겁니다.
방법2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
명령어를 쓰셔서 해당세션의 트랜잭션 레벨을 커밋되지 않은 읽기로 세팅하시면됩니다.
추가
이렇게 하면 특정 컬럼을 대상으로 하는게 아니라 해당테이블(방법1) 또는 세션(방법2)에서는 커밋이 되지 않아도
테이블을 읽어 옵니다.(롤백되면 없는 데이터들이겠죠..) 이것을 Dirty Read라고 표현합니다.