Data Base/SQL 튜닝

TX LOCK ⓑ 특정 행에 unique key, primary key 에 해당하는 데이터를 입력, 수정하는 경우

잇꼬 2024. 2. 10. 23:21
728x90
반응형
SMALL

■ 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문을 수행한다.

728x90
반응형
LIST