멀고 험난한 길 님께서 말씀하신데로
A 에서 어떠한 작업을 하고 Commit(트랜잭션 종료 겠죠) 하면 B 에서는 아직 확인이 되지 않습니다. 이 때 B 에서 아무런 작업없이 commit 명령을 수행하면 그제서야 A 에서 작업한 내용이 반영된 것을 확인할 수 있죠. 이게 잘 못 된 것이 아닌가 생각 됩니다.
말씀하신 데로 "A에서 커밋한다는것은 실질적으로 데이터를 적용시킨다는것이지" 라고 하셨는데 그러면 해당 테이블에 물리적으로 기록이 되었다는 것을 의미하는게 아닌가요? 그러면 다른 쪽에서는 그 내용을 확인할 수 있어야 하는게 정상 아닌가요?
isql tool 이 하나의 트랜잭션을 물고 실행되는 것이라 매번 Commit 을 해야만 하는 독특한 특성이 있는게 아닌가 하는 생각도 듭니다.
실제 다른 DBMS 에서 테스트를 해 보았는데 예를 들어 MySQL 의 경우 InnoDB를 사용하면 Transaction 을 사용할 수 있는데 MySQL 에서는 제가 예상한 동작을 하더군요.
하나의 DB 에 두개의 Client 를 연결하고 A 에서 테이블을 생성하면 DDL 명령이기 때문에 자동으로 commit 이 되고 B에서도 해당 테이블을 확인할 수 있습니다.
그리고 A 에서 트랜잭션을 시작(begin) 하고 테이블에 임의의 레코드를 여러개 삽입하였습니다. 삽입을 마치고 B 에서 Query 해 보면 삽입된 레코드가 확인 되지 않았습니다. 당연히 A 의 트랜잭션이 종료되지 않았기 때문에 데이터를 확인할 수 없는 것이겠죠. 그리고 A 의 트랜잭션이 종료 되도록 commit 명령을 수행하면 B 에서는 아무런 조치 없이 Query 만 하면 추가된 레코드를 확인할 수 있었습니다. B에서 수행한 것이라고는 SELECT 문 밖에 없습니다.
이렇게 동작을 해야 하는게 아닌가요?
멀고도험한길 님이 쓰신 글 :
: 트랜잭션을 이용하시면됩니다.
:
: A PC에서 연결.
: B PC에서연결.
: A,B 어디에서도 아무런 작업을하지않으면 내용은같죠.
:
: A에서 insert한다면
: A에서는
: 1.트랜잭션 시작
: 2.쿼리실행
: 3.트랜잭션 종료.
:
: 현재까지는 B에서 어떤작업이 이루어졌는지 알수가 없습니다.
: B에서는
: 1.트랜잭션 종료
: 2.트랜잭션 시작
: 면 앞에서 A가처리한내용을 알수있습니다.
:
: 매번 연결을 종료하지않고 트랜잭션만 다시시작하면 반영된데이터를 얻을수있습니다.
:
: 연결종료후 다시연결한다는게 트랜잭션을 다시시작하는것과 마찮가지입니다..
: A에서 커밋한다는것은 실질적으로 데이터를 적용시킨다는것이지..
: 다른 클라이언트에게 변경되었다고 통보하는게아닙니다.
|