deadlock in postgres on simple update query
I'm working with postgres 9.1 and getting deadlock exception under
excessive execution of a simple update method.
According to the logs the deadlock occurs due to execution of two
identical updates at the same time.
update public.vm_action_info set last_on_demand_task_id=$1, version=version+1
How does two identical simple updates can deadlock each other ?
The error that I'm getting in the log
2013-08-18 11:00:24 IDT HINT: See server log for query details. 2013-08-18
11:00:24 IDT STATEMENT: update public.vm_action_info set
last_on_demand_task_id=$1, version=version+1 where id=$2 2013-08-18
11:00:25 IDT ERROR: deadlock detected 2013-08-18 11:00:25 IDT DETAIL:
Process 31533 waits for ShareLock on transaction 4228275; blocked by
process 31530. Process 31530 waits for ExclusiveLock on tuple (0,68) of
relation 70337 of database 69205; blocked by process 31533. Process 31533:
update public.vm_action_info set last_on_demand_task_id=$1,
version=version+1 where id=$2 Process 31530: update public.vm_action_info
set last_on_demand_task_id=$1, version=version+1 where id=$2 2013-08-18
11:00:25 IDT HINT: See server log for query details. 2013-08-18 11:00:25
IDT STATEMENT: update public.vm_action_info set last_on_demand_task_id=$1,
version=version+1 where id=$2 2013-08-18 11:00:25 IDT ERROR: deadlock
detected 2013-08-18 11:00:25 IDT DETAIL: Process 31530 waits for
ExclusiveLock on tuple (0,68) of relation 70337 of database 69205; blocked
by process 31876. Process 31876 waits for ShareLock on transaction
4228275; blocked by process 31530. Process 31530: update
public.vm_action_info set last_on_demand_task_id=$1, version=version+1
where id=$2 Process 31876: update public.vm_action_info set
last_on_demand_task_id=$1, version=version+1 where id=$2
the schema is:
CREATE TABLE vm_action_info ( id integer NOT NULL,
version integer NOT NULL DEFAULT 0,
vm_info_id integer NOT NULL,
last_exit_code integer,
bundle_action_id integer NOT NULL,
last_result_change_time numeric NOT NULL,
last_completed_vm_task_id integer,
last_on_demand_task_id bigint,
CONSTRAINT vm_action_info_pkey PRIMARY KEY (id ),
CONSTRAINT vm_action_info_bundle_action_id_fk FOREIGN KEY
(bundle_action_id) REFERENCES bundle_action (id) MATCH SIMPLE ON UPDATE NO
ACTION ON DELETE CASCADE,
CONSTRAINT vm_discovery_info_fk FOREIGN KEY (vm_info_id) REFERENCES
vm_info (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT vm_task_last_on_demand_task_fk FOREIGN KEY
(last_on_demand_task_id) REFERENCES vm_task (id) MATCH SIMPLE ON UPDATE NO
ACTION ON DELETE NO ACTION,
CONSTRAINT vm_task_last_task_fk FOREIGN KEY (last_completed_vm_task_id)
REFERENCES vm_task (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO
ACTION ) WITH ( OIDS=FALSE ); ALTER TABLE vm_action_info OWNER TO vadm;
-- Index: vm_action_info_vm_info_id_index
-- DROP INDEX vm_action_info_vm_info_id_index;
CREATE INDEX vm_action_info_vm_info_id_index ON vm_action_info USING btree
(vm_info_id );
No comments:
Post a Comment