[ MSSQL - LOCK ]
/* MS SQL의 LOCK 개념 *
1. MS SQL 은 기본적으로 레코드 락임
2. MS SQL Server는 SELECT시 LOCK을 걸지 않음
(내부적으로는 SELECT LOCK이라는게 걸리지만, 이 LOCK은 INSERT, UPDATE LOCK하고는 다름)
*/
/* SELECT 종류 */
/*1. 단순 SELECT */
--Insert, Update중에 아래 SELECT문장을 수행 할 경우
-- > 조회결과에 Insert, Update중인 자료가 존재 하면 대기함.
-- > 조회결과에 Insert, Update중인 자료가 존재 하지 않으면 바로 조회 됨.
--단, 이때 index scan인 경우에 해당 됨
-- 즉, 만약 full scan인 경우에는 조건절 및 결과절과 관계 없이 모조건 대기함.
SELECT * FROM TEMP_KYH;
SELECT * FROM TEMP_KYH WHERE temp1 = '2';
/*2. with(nolock), WITH(READUNCOMMITTED) */
--Insert, Update중 lock이 발생했지만 commit되지 않은 상태라도
--commit되었다 판단하여 자료가 조회 됨
SELECT * FROM TEMP_KYH with(nolock);
SELECT * FROM TEMP_KYH WITH(READUNCOMMITTED);
/*3. with(readpast) */
--Insert, Update중 lock이 발생한 레코드를 제외 하고 나머지 자료만 조회
SELECT * FROM TEMP_KYH with(readpast);
/*4. with(updlock) */
--SELECT시 UPDATE LOCK을 설정
--조회결과에 Insert, Update중인 자료가 존재시 조회 대기 함.
SELECT * FROM TEMP_KYH WITH (UPDLOCK) WHERE temp1 = '1';
/* PROCEDURE 개발시 아래 문장존재 하면 좋음 */
--procedure에서 모든 select문장에 with(nolock), with(readpast)을 기술하지 않아도 됨
--SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --with(unlock)
--SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --with(readpast)