Programming/SQL

커밋과 롤백, DATE 형 칼럼에 값 insert 하기. 2021-07-23

최동훈1 2021. 7. 23. 16:15

지난 포스트에서 내가 관련 개념을 설명할 때는, 직접 SQL developer에서 프로그래밍 해 보지는 않았는데, 오늘 직접 해보니, 막연한 개념을 확실히 확인할 수 있었다.

**커밋,롤백, 트랜젝션에 대한 자세한 설명은 내 이전포스트 참고바람.

우선 서로다른 세션이 한 저장소에 접근하는것을 보이기 위해 SQL developer를 두번 열었다.

좌, Session 1, 우 Session2라 칭함.

이렇게 연 다음, Session2에서 ID 가 newlec인 레코드의 칼럼을 update 한 뒤 Session1에서 해당 레코드의 칼럼중 하나인 gender에 접근하여 바꾸려 하자 보이는 것처럼 바로 ROCK이 걸렸다.

이유는 Session2가 아직 commit 하지 않았으므로, 해당 레코드에 관한 트랜젝션이 완료되지 않았다고 간주하고, 해당 테이블이 Session2가 작업을 완료할때까지, 다른 세션이 접근못하도록 막아둔 것이다. 여기서 다시 Session2에서 commit을 하면 해당 테이블이 Unlock되고, Session1이 접근 가능하여 바로 Gender가 '남자'로 업데이트된다. 그런데 이것도 Sesseion1 의 임시저장소에서만 update되고, Session1이 commit하기 전에는, 영구저장소에 반영 안됨+해당 테이블 ROCK이라 Session2에서 접근 못함이 된다.

Session2에서 commit해서 Unrock된 실행된 모습.

Session2에서 commit하자마자 ROCK이 풀리며, Session1의 작업이 반영되었다.

이후, Session1과 Session2의 테이블 전체를 출력하니 서로다름이 보인다.. 왜냐하면 또 Session1에서 커밋을 안했기 때문이다.

 

오류나서 해결한 것. 우선 비교연산자 연습을 위해서 테이블에 다양한 칼럼을 추가하기로 했다. 그런데..

이런 오류가 났다. "column not allowed here" 의역하자면 칼럼 값은 여기 올수 없다 인데.. 무엇이 잘못된건지 구글링으로 찾아보니, 아주 오래된 블로그에서

- insert 문에서 문자열에 작은따옴표(') 를 하지 않을 경우

- 작은따옴표 대신신에 큰따옴표를 사용할 경우

- 내장함수 등의 이름이 오타로 잘못된 경우

 

이런 경우에  ORA-00984 오류가 난다는 것을 알게 되었다. 그리고 코드를 다시보니, TIMESTAMP 를 칼럼의 값으로 내가 삽입하려고 했는데 이것이 아마 DATE 형이 아니라서 이런 오류가 난 것 같다.

그런데 문제는 나는 DATE형으로 시간을 넣는 방법을 모른다. 그래서 또 찾아보니, systimestamp를 넣으면 된다고 나온다. 그래서 그렇게 넣어보았다.

insert into member values('kakao','1234','최동훈','남자','2000-01-31','010-9209-6429',SYSTIMESTAMP - INTERVAL '1' minute,'donghoon141@naver.com');

삽입됨. 해당 날짜를 클릭하니 시/분/초 까지 나옴.


이러니 DATE 형식에 맞게 저장 되었다. -그런데 왜 오라클은 DATE 형 밖에 없는걸까? mssql은 datetime2 등 엄청 많던데..

 

의문: 그럼 영구저장소는 사용자별로 정하는 것인가? 그리고 세션을 나누는 서버는 도데체 무엇인가??

답: 사용자별로 정하는 것이고, 세션을 나누는 기준은 같은 사용자 이름에 서로다른접속이면 다른 세션으로 간주한다.-> 정확한 설명은 다음포스트에 보강해줌.

 

공부시간 3시간.

순공부시간 1시간.