전 회사에서 MariaDB를 사용하다가 이직 후에 OracleDB를 사용하기 시작했다.
이전에는 운영DB의 경우, SELECT권한 밖에 없었고 개발DB도 auto commit이 기본값이라 명령어를 실행 후, 하나하나 commit을 해주지 않아도 바로 적용이 되었었다.
현재는 명령어 실행 후, commit을 해주어야하는데 테이블을 새로 만들어 데이터를 넣는 작업이 있었다.
그런데 테이블을 새로 만들어 데이터를 INSERT한 후 commit을 했는데 데이터가 하나도 조회되지 않았다.
분명 INSERT가 완료 되었는데
다른 창에서 commit하고 확인해보니 데이터가 없다..
트랜잭션을 확인해봤는데 commit을 했음에도 불구하고 트랜잭션이 종료되지 않은 상태.
뭔가 이상하다 싶어 테이블을 날리고 다시 해보려는데
해당 에러가 떴다.
이 에러의 원인은 다른 세션의 창에서 각각 실행을 했기 때문이다. A세션에서 INSERT를 하고, B세션에서 commit을 한 게 원인이다. 삽입할 데이터가 너무 많아 창을 따로 두면서 작업하다가 발생했다.
한 세션에서 조작 중인 데이터는 트랜잭션이 완료(=커밋, 롤백)되기 전까지는 다른 세션에서 조작할 수 없는 상태(LOCK)이 된다.
이번 같은 경우, 해결을 위해서는 A세션에서 commit을 해주거나 세션을 KILL한 후에 다시 작업을 하면 된다.
SELECT A.SID
, A.SERIAL#
, A.STATUS
FROM V$SESSION A
, V$LOCK B
, DBA_OBJECTS C
WHERE A.SID = B.SID
AND B.ID1 = C.OBJECT_ID
AND B.TYPE = 'TM'
AND C.OBJECT_NAME = 'TEST_SESSION';
OBJECT_NAME으로 테이블명을 검색하면
SID(Session identifier)와 SERIAL#(serial number)이 나온다.
ALTER SYSTEM KILL SESSION '198,17831' IMMEDIATE ;
SID와 SERIAL#으로 세션을 KILL하면 된다.