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 4421 게시물 읽기
No. 4421
select 문에서 for update 문 어떤 기능을 하죠?
작성자
한사랑
작성일
2002-10-31 02:36
조회수
3,039

세션처리 만들다 보다 간결한 쿼리를 찾아 PostgreSQL 문서를 보다가 아래와 같은 쿼리가 가능할 것을 발견했습니다.

 

select 문에서 사용하는 for update 문이 어떤 기능을 하는지 아시는 분 계시면 설명좀 부탁드립니다.

 

SELECT data FROM $session_table WHERE session_id='$key' AND last_active >= $expiry FOR UPDATE;

 

위의 마지막에 보시면 for update 라는 문이 있는데 정확히 알고 써야 할것 같아 질문드립니다.

 

늘 행복하세요!

이 글에 대한 댓글이 총 3건 있습니다.

처음보는 거네요 =_=;

아마 select된 부분만을 락을 걸수 있도록 어떤 표시를 하는 듯 합니다

 

http://database.sarang.net/database/postgres/manual/manual-7.2/sql-lock.html

신기배(nonun)님이 2002-10-31 04:05에 작성한 댓글입니다.

답글 고맙습니다.

링크해주신 문서 차한잔 하면서 천천히 봐야 겠어여!

^^*

늘 행복하세요!

한사랑님이 2002-11-01 01:27에 작성한 댓글입니다.

SELECT .... FOR UPDATE;

 

이런식으로 끝 부분에 FOR UPDATE 절이 붙으면 이것은 SELECT 로 선택된 rows (records) 들에 대해서 EXCLUSIVE LOCK 을 걸어 줍니다. EXCLUSIVE LOCK 에 대해서는 위의 기배님이 언급한 문서를 참조하시기 바랍니다.

 

구문의 뜻을 해석하자면 내가 SELCT 한 row 들은 UPDATE 를 하기 위해서 SELECT 를 한것이다. 그러므로 다른 사람들은 내가 작업을 끝낼때까지는 건드리지 말아라는 의미입니다.

 

테스트는 간단하게 할수 있습니다. 일단 PostgreSQL 서버로 두개의 클라이언트를 통해 각각 접속을 합니다. 즉 두개를 접속한다는 것이죠. 각각을 A 창, B 창 이라고 합시다.

 

A 창에서 다음과 같이 작업합니다.

 

psql db_name

 

Welcome to psql, the PostgreSQL interactive terminal.

 

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help on internal slash commands

\g or terminate with semicolon to execute query

\q to quit

 

advance=#

 

여기서 다음과 같이 입력합니다.

BEGIN; -- transaction 의 시작을 알림.

SELECT * from table_name WHERE a='1234' FOR UPDATE;

 

여기까지 입력을 하면 해당 rows 들이 쭉 나열이 될것입니다. 이제 여기까지만 하고 B 창으로 갑니다.

 

B 창에서

 

psql db_name

Welcome to psql, the PostgreSQL interactive terminal.

 

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help on internal slash commands

\g or terminate with semicolon to execute query

\q to quit

 

advance=#

 

여기서 다음과 같이 입력을 해 봅니다.

 

UPDATE table_name SET b='werew' WHERE a='1234';

 

엇.... 다음 cursor 가 나타나질 않습니다. 이유가 뭘까요.

 

일단 A 창으로 옮겨서 다음 명령어를 입력합니다.

 

COMMIT;

 

이제 B 창으로 가봅니다.

엇 UPDATE 실행이 다 끝나 있군요.

 

여기까지 해 보셨다면 이제 FOR UPDATE 절의 역할을 알것입니다. FOR UPDATE 절로 선택된 SELECT row 들은 해당 transaction 이 끝날때 까지다는 다른 어느 누구도 손을 대지 못합니다. 자신의 TRANSACTION 작업이 끝나야만이 다른 작업이 가능해 지는 것입니다.

 

도움이 되셨길 바랍니다.

정재익(advance)님이 2002-11-01 07:30에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4425데이타는 얼마 안되는데 서버에 생성된 db 파일 사이즈가 엄청 커요. [5]
김시연
2002-11-03
1159
4424[질문]primary 생성시 NOTICE 항목이 안보이려면.. [3]
유지형
2002-11-02
882
4422[사과] 죄송합니당.^^; [1]
이근호
2002-10-31
823
4421select 문에서 for update 문 어떤 기능을 하죠? [3]
한사랑
2002-10-31
3039
4420잘못한 자료 복구의 방법은? [1]
박기원
2002-10-30
905
4419Join Select 후 메세지
icarus
2002-10-30
861
4417Inner Join, Outer Join? [1]
김정수
2002-10-29
1184
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다