database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 2164 게시물 읽기
No. 2164
트랜잭션 테스트를 해 봤는데 이상한 일이... 쩝
작성자
어떤생각
작성일
2001-01-16 20:20
조회수
4,830

흠... 제가 드린 질문은요...

 

vb등의 프로그램시 connection개체를 열고(conn.open) conn.begintrans를 하면 트랜잭션이 시작되는 것은 맞습니다. 그리고 conn.committrans를 하면 트랜잭션이 완료되는 것도 맞구요.

그러니까 begintrans와 committrans는 ODBC관리자에게 이제 트랜잭션이 시작한다, 완료되었다는 그런 신호를 보내는 명령어지요. 그러니까 그 사이에 있는 모든 명령은 트랜잭션 하에서 실행됩니다. 이건 물론 잘 실행됩니다.

 

그런데 제 질문은 트랜잭션의 실행된 후에 Lock을 걸려면 이 ODBC관리자에서 내리는 트랜잭션명령 후에 Lock명령이 실행되는가? 하는 것이었는데요...

 

테스트를 해 보았읍니다. 그런데 결과가 좀....

 

먼저 결과부터 말하면

ODBC관리자에서 내리는 Lock 명령은 실행되지 않는다. 입니다.

 

즉,

conn.open (ODBC관리자에 새로운 연결을 생성)

conn.begintrans (트랜잭션 시작)

conn.execute "lock table test in share mode" (Lock 명령 실행)

conn.execute "insert...." (insert 명령 실행)

conn.execute "delete ...." (delete 명령 실행)

conn.committrans (트랜잭션 완료)

conn.close (ODBC 연결해제)

 

이렇게 실행하면 Lock이 걸리지를 않습니다. 중간에 다른 insert문을 다른 프로세스에서 실행하면 실행이 되는 거지요. 하지만 commit할때 중간에 끼어든 insert명령으로 인하여 생긴 레코드가 원래 transaction시작시에는 없던 것이었기 때문에 commit되는 순간 사라져버립니다. 그래서 데이타베이스 무결성은 유지됩니다. (흠 이러면 안되는데... 쩝)

 

하여간 이렇게 하면 안되지만 다음처럼하면

 

conn.open (ODBC관리자에 새로운 연결을 생성)

conn.execute "begin work" (트랜잭션 시작)

conn.execute "lock table test in share mode" (Lock 명령 실행)

conn.execute "insert...." (insert 명령 실행)

conn.execute "delete ...." (delete 명령 실행)

conn.execute "commit work" (트랜잭션 완료)

conn.close (ODBC 연결해제)

 

Lock이 실행됩니다. Lock table문이 실행된 이후에 다른 프로세스에서 insert나 delete등의 문을 실행하면 table이 Lock이 걸려있기 때문에 insert문이 실행되지 않고 대기중의 상태로 들어갑니다. lock이 걸리는 것이지요.

 

그런데 이상한것은 이 Lock이 commit이 될때까지 유지되는 것이 아니라 lock명령 다음의 insert문이 실행되면 풀려버립니다.

즉, 트랜잭션실행

/> lock으로 테이블을 잠군다.

/> 다른프로세스에서 insert문을 실행하면 대기 상태로 들어간다.

/> lock다음의 insert문을 실행한다.

/> 그러면 Lock이 풀리고 대기상태의 다른 insert문이 실행된다.

/> lock다음다음줄의 delete문을 실행한다.

/> commit을 실행하면 중간에 끼어든 insert문에 의한 새로운 레코드는 없어진다. 의 동작이 발생하게 됩니다.

이상하죠...^^

 

또 다른 이상한점.

트랜잭션실행

/> lock으로 테이블을 잠군다.

/> 다른프로세스에서 begin work을 실행

/> 다른 프로세스에서 lock으로 테이블을 다시 잠군다.

(그러면 원래 lock이 걸려 있으니까 두번째 lock이 걸리지 않고 대기 할줄 알았는데 의외로 두번째 Lock이 걸리네요...흠)

/> 원래 프로세스에서 insert문을 실행하면 두번째 Lock때문에 insert가 실행되지 않고 대기 상태로 들어간다. (에구 정말 이상하다)

/> 다른 프로세스(두번째 Lock을 건)에서 insert문을 실행한다. 그러면 deadlock detected message가 나오고 이 트랜잭션이 실패했다고 나오는군요. 그러면서 두번째 Lock이 풀립니다. (이건 또 원래의 Lock때문인가 보죠...)

/> 그러면 대기상태의 원래 insert문이 실행된다.

/> 그리고 다음의 delete문을 실행한다.

/> commit을 실행된다.

의 동작이 발생하게 됩니다.

더 이상하죠...^^ 원래 Lock이 걸려 있으면 그 다음 Lock을 걸려고 하면 충돌하여 대기상태로 들어가게 되는 것 아닌가요? 원래 Lock이 풀릴때까지...

 

제가 원래 생각했던 대로라면

원래 프로세스에서 트랜잭션을 시작한다.

/> lock을 건다. (그러면 이후에 다른 프로세스에서 오는 모든 lock이나 insert등의 명령이 대기상태에 들어간다.)

/> 명령들을 모두 실행한다.

/> commit을 한다. 그러면 lock이 풀린다.

/> 이제 대기상태에 있던 다른 프로세스 명령들이 실행된다.

의 동작이 일어나야 하는거 아닌가요?

 

에구 제가 잘못알고 있는점이 있다면 설명을 부탁드립니다. Lock이 혹시 유지 시간을 갖구있나?... 쩝.

[Top]
No.
제목
작성자
작성일
조회
2158게시판 소스를~~~~~~~~~
veryy
2001-01-16
5889
2166┕>Re: 게시판 소스를~~~~~~~~~
엠브리오
2001-01-18 13:25:27
6357
2155시간 정보를 PostgreSQL 에 저장하고자 한다면...
정재익
2001-01-16
5738
2185┕>Re: 시간 정보를 PostgreSQL 에 저장하고자 한다면... 2
김상기
2001-01-22 04:29:52
9241
2154PostgreSQL 7.0.3 설치가 안되요~
초보
2001-01-16
5093
2156┕>Re: PostgreSQL 7.0.3 설치가 안되요~
정재익
2001-01-16 12:16:34
5567
2157 ┕>한번 봐 주세요 ... 에러 화면 입니다.
초보
2001-01-17 09:29:19
5292
2152odbc의 conn.begintrans와 sql문의 begin work과의 차이는?
어떤생각
2001-01-15
4252
2153┕>Re: odbc의 conn.begintrans와 sql문의 begin work과의 차이는?
정재익
2001-01-16 00:09:05
4820
2164 ┕>트랜잭션 테스트를 해 봤는데 이상한 일이... 쩝
어떤생각
2001-01-16 20:20:49
4830
2169  ┕>Re: 트랜잭션 테스트를 해 봤는데 이상한 일이... 쩝
정재익
2001-01-18 15:28:47
5626
2150데이타 베이스 초기화는 성공했으니 데몬은 실패하는 이유가 몰까요?
나그네
2001-01-13
4403
2151┕>Re: 데이타 베이스 초기화는 성공했으니 데몬은 실패하는 이유가 몰까요?
정재익
2001-01-13 18:32:46
5531
2147어떤 디렉트로의 어떤내용을 백업 받나요
밝은세상
2001-01-12
3685
2149┕>Re: 어떤 디렉트로의 어떤내용을 백업 받나요
정재익
2001-01-13 13:48:42
4262
2145table에 lock 이 걸린것 같은데...
밝은세상
2001-01-12
4240
2146┕>Re: table에 lock 이 걸린것 같은데...
정재익
2001-01-12 13:47:09
4261
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다