■ TX LOCK
2. 특정 행에 unique key, primary key 에 해당하는 데이터를 입력, 수정하는 경우
enq : TX - row lock contention / lock mode가 풀린다.
<hr sess_1>
create table hr.unique_test(id number);
create unique index hr.unique_test_idx on hr.unique_test(id);
if)
create index hr.unique_test_idx on hr.unique_test(id);
-> 수행했다면 no-unique 로 등록된다.
<hr sess_1>
insert into hr.unique_test(id) values (1);
<hr sess_2>
insert into hr.unique_test(id) values (1);
--> waiting // 중복되는지 확인(rollback이면 수행 | commit이면 중복값으로 충돌되어 오류발생) + 대기중
# transaction 해당하는 행에 대해서 TX LOCK TYPE이면 LMODE는 X, 6 LMODE 수행이 되면서 동일한 값이 다른 세션에서 입력이 된 경우 REQUEST S(share), 4 로 대기 한다.
<sys session>
select sid, serial#, username, blocking_session, event, sql_id, prev_sql_id
from v$session
where event like '%TX%';
#) lock 정보 확인
select * from v$lock where sid in (18, 24) and type in ('TX', 'TM');
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
49B540A8 49B540D4 18 TX 1245192 1549 0 4 182 0 => shared mode
F6EFD058 F6EFD088 18 TM 89144 0 3 0 182 0
F6EFD058 F6EFD088 24 TM 89144 0 3 0 183 0
487F15FC 487F163C 18 TX 786433 1525 6 0 182 0
4803D93C 4803D97C 24 TX 1245192 1549 6 0 183 1
<hr sess_1>
-> commit 수행
commit;
<hr sess_2>
-> sess_1 에서 commit 수행 시 동시에 오류발생
insert into hr.unique_test(id) values (1);
=> if) sess_1 에서 rollback을 수행한 경우 sess_2에서 insert문을 수행한다.
'Data Base > SQL 튜닝' 카테고리의 다른 글
full table scan, rowid scan (1) | 2024.02.10 |
---|---|
TX LOCK ⓒ 변경하고자 하는 블록의 ITL에 트랜잭션 엔트리를 등록하고자 하는 경우 (1) | 2024.02.10 |
TX LOCK ⓐ 특정 행을 변경하고자 하는 경우 (0) | 2024.02.10 |
Redo 기능, logging mode & nologging mode (2) | 2024.02.07 |
Transaction 처리 순서 (1) | 2024.02.07 |