안녕하세요~
DB 테이블을 이용해서 큐를 구현하고 있습니다.
Table "crawl.p3_analyze_request"
Column | Type | Modifiers
----------------+-----------------------------+-------------------------------------------------------------------
arid | bigint | not null default nextval('p3_analyze_request_arid_seq'::regclass)
bid | bigint |
link | text |
type | character varying(20) | not null
follow_content | boolean | not null default false
xpath | boolean | not null default false
entry_time | timestamp(0) with time zone | not null default now()
status | crawl_status | not null default 'none'::crawl_status
pick_time | timestamp(0) with time zone |
property | text |
error | text |
Indexes:
"p3_analyze_request_pkey" PRIMARY KEY, btree (arid)
"p3_analyze_request_idx" btree (entry_time) WHERE status <> 'finish'::crawl_status
Triggers:
p3_analyze_request_tr AFTER INSERT ON p3_analyze_request FOR EACH ROW EXECUTE PROCEDURE func_p3_analyze_request_tr_insert()
p3_analyze_request_tr1 AFTER UPDATE ON p3_analyze_request FOR EACH ROW EXECUTE PROCEDURE func_p3_analyze_request_tr_update()
이고요. queue 를 pop() 하는 부분입니다. 함수로 되어 있는데 핵심 부분만 올립니다.
update crawl.p3_analyze_request set status='open'::crawl_status, pick_time=now() where arid=(select arid from crawl.p3_analyze_request where status='none'::crawl_status and entry_time > now()-('2 day'::interval) order by arid limit 1) returning *
update 하면서 동시에 그 row를 리턴하게 했는데요.
이 쿼리가 동시에 다른 프로세스에서 들어가면 여러 놈이 이 값을 가져갑니다. 이 부분에 MVCC가 해당되지 않는건가요? =_=
이 문제를 해결하려면 row level lock 으로는 안되고 테이블 락이 걸려야만 하는건가요 ㅠ
답변 부탁드립니다~
|