post gresql 기반 줄 잠 금 for update 테스트

생 성 표:

CREATE TABLE db_user
(
 id character varying(50) NOT NULL,
 age integer,
 name character varying(100),
 roleid character varying,
 CONSTRAINT db_user_pkey PRIMARY KEY (id)
)
몇 개의 데 이 터 를 마음대로 삽입 하면 된다.
자물쇠 없 는 프레젠테이션
1.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 열 고 실행:

begin;
select * from db_user where name='lisi';
출력 결과:

2.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 하나 더 열 고 실행:

begin;
select * from db_user where name='lisi';
출력 결과:

2.잠 금 프 리 젠 테 이 션 추가(for update)
1.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 열 고 실행:

begin;
select * from db_user where name='lisi' for update;
출력 결과:

2.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 하나 더 열 고 실행:

begin;
select * from db_user where name='lisi' for update;
출력 결과:

조회 가 계속 실행 중 입 니 다.
3.첫 번 째 창 실행:commit;두 번 째 창 에서 검색 작업 을 즉시 실행 합 니 다.결 과 는 다음 과 같 습 니 다.

두 번 째 창 은 commt 를 제출 하 는 것 을 기억 합 니 다.
3.잠 금 프 리 젠 테 이 션 추가(for update nowait)
1.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 열 고 실행:

begin;
select * from db_user where name='lisi' for update nowait;
출력 결과:

2.postgresql 의 SQL Shell 또는 pgAdmin 의 SQL 편집기 창 을 하나 더 열 고 실행:

begin;
select * from db_user where name='lisi' for update nowait;
출력 결과:

자원 대기 없 이 오류 메 시 지 를 되 돌려 줍 니 다.
3.첫 번 째 창 실행:commit;제출 성공,자원 잠 금 해제.
요약:
for update nowait 와 for update 는 조 회 된 결과 집합 에 자 물 쇠 를 추가 합 니 다.다른 것 은 다른 스 레 드 가 결과 가 집 중 된 데 이 터 를 수정 하고 있 으 면 for update nowait 는 자원 을 기다 리 지 않 습 니 다.결과 가 집 중 된 일부 데이터 가 잠 겨 있 는 것 을 발견 하면 즉시"55P 03 오류"로 돌아 갑 니 다.내용 은 기록 에서 자 물 쇠 를 얻 을 수 없습니다.
명령 설명:
begin;--트 랜 잭 션 시작
begin transaction;--트 랜 잭 션 시작
commit;--제출 하 다.
rollback;--스크롤 백
set lock_timeout=5000;--시간 초과 설정
주의:
링크 조회 에 잠 금 을 추가 할 때 단일 연결 형식 은 지원 되 지 않 습 니 다.예 를 들 어:

select u.*,r.* from db_user u left join db_role r on u.roleid=r.id for update;
다음 형식 을 지원 하고 두 표 에 연 결 된 데 이 터 를 잠 금 합 니 다.

select u.*,r.* from db_user u, db_role r where u.roleid=r.id for update;
추가:PostgreSQL select for update 지정 열(oracle 호 환)
우 리 는 selection for update 문 구 를 사용 하여 특정한 시 계 를 잠 글 수 있 습 니 다.Oacle 에서 우 리 는 for update 문 구 를 지정 한 후에 특정한 열 을 지정 하여 지정 한 열의 데 이 터 를 단독으로 잠 글 수 있 습 니 다.
oracle 예:
작성 표:

SQL> create table t1(id int, c2 varchar(20), c3 int, c4 float, c5 float); 
Table created.
SQL> create table t2(id int, c6 int); 
Table created.
SQL> insert into t1 values (1, 'SA_REP', 1, 100, 1); 
1 row created.
SQL> insert into t1 values (1, 'SA_REP123', 1, 100, 1); 
1 row created.
SQL> insert into t2 values (1, 2500);
1 row created.
조회:
우 리 는 c4 열 만 잠 그 는 데 아래 의 조 회 를 사용 합 니 다.

SQL> SELECT e.c3, e.c4, e.c5 
 2  FROM t1 e JOIN t2 d 
 USING (id) 
 WHERE c2 = 'SA_REP' 
 AND c6 = 2500 
 3 4 5 6  FOR UPDATE OF e.c4 
 7  ORDER BY e.c3; 
  C3   C4   C5
---------- ---------- ----------
   1  100   1
PostgreSQL 호 환 방법:
작성 표:

create table t1(id int, c2 text, c3 int, c4 float, c5 float); 
create table t2(id int, c6 int); 
insert into t1 values (1, 'SA_REP', 1, 100, 1); 
insert into t1 values (1, 'SA_REP123', 1, 100, 1); 
insert into t2 values (1, 2500);
pg 에서 사용 하 는 방법 은 Oacle 과 유사 합 니 다.order by 문법 을 앞 에 놓 고 열 이름 을 표 이름 으로 바 꿔 야 합 니 다.

bill=# SELECT e.c3, e.c4, e.c5 
bill-# FROM t1 e JOIN t2 d 
bill-# USING (id) 
bill-# WHERE c2 = 'SA_REP' 
bill-# AND c6 = 2500 
bill-# ORDER BY e.c3
bill-# FOR UPDATE OF e ;
 c3 | c4 | c5 
----+-----+----
 1 | 100 | 1
(1 row)
인증:
pg 에서 지정 한 줄 만 잠 겨 있 는 지 확인 할 수 있 습 니 다.
1.pgrowlocks 플러그 인 설치

bill=# create extension pgrowlocks;
CREATE EXTENSION
2.관찰
t1 시계 잠 김:

bill=# select * from pgrowlocks('t1'); 
 locked_row | locker | multi | xids |  modes  | pids 
------------+--------+-------+--------+----------------+--------
 (0,1)  | 1037 | f  | {1037} | {"For Update"} | {2022}
(1 row)
t2 시계 가 잠 겨 있 지 않 음:

bill=# select * from pgrowlocks('t2'); 
 locked_row | locker | multi | xids | modes | pids 
------------+--------+-------+------+-------+------
(0 rows)
우 리 는 t1 표 에 구체 적 으로 잠 겨 있 는 데 이 터 를 다시 볼 수 있다.

bill=# SELECT * FROM t1 AS a, pgrowlocks('t1') AS p 
bill-# WHERE p.locked_row = a.ctid; 
 id | c2 | c3 | c4 | c5 | locked_row | locker | multi | xids |  modes  | pids 
----+--------+----+-----+----+------------+--------+-------+--------+----------------+--------
 1 | SA_REP | 1 | 100 | 1 | (0,1)  | 1037 | f  | {1037} | {"For Update"} | {2022}
(1 row)
이외에 도 pg 에서 for update 자구 에 다른 옵션 이 있 습 니 다.
UPDATE C 현재 트 랜 잭 션 은 모든 필드 를 변경 할 수 있 습 니 다.
NO KEY UPDATE C 현재 트 랜 잭 션 은 referenced KEY 를 제외 한 필드 를 변경 할 수 있 습 니 다.
SHARE C 기타 사 무 는 모든 필드 를 변경 할 수 없습니다.
KEY SHARE C 기타 사 무 는 참 조 된 KEY 필드 를 변경 할 수 없습니다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기