| From: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
|---|---|
| To: | Jon Swinth <jswinth(at)atomicpc(dot)com> |
| Cc: | <pgsql-general(at)postgresql(dot)org> |
| Subject: | Re: Fix FK deadlock, but no magic please |
| Date: | 2003-01-16 22:43:31 |
| Message-ID: | 20030116143605.D9839-100000@megazone23.bigpanda.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-general |
On Thu, 16 Jan 2003, Jon Swinth wrote:
> I am a little confused on your examples
>
> On Thursday 16 January 2003 12:00 pm, Stephan Szabo wrote:
> >
> > Well, for example (assuming two pk rows with 1 and 2 as keys)
> >
> > T1: begin;
> > T1: insert into fk values (1);
> > T2: begin;
> > T2: insert into fk values (2);
> > T1: update pk set nonkey='a' where key=2;
> > T2: update pk set nonkey='b' where key=1;
> >
>
> Maybe I don't understand this example. If T2 inserted fk 2, how did T1 manage
> to update a record that references it before T2 committed? For T1, fk 2
> doesn't exist yet so there couldn't be any records referencing it.
Noone has completed in the above. They're two concurrent transactions
that may deadlock.
AFAICT, what you want is a sequence like the below (including lock
annotations) for the above.
Transaction 1: begin;
Transaction 2: begin;
Transaction 1: insert into fk values (1);
- Checks pk table for value, finds it, gets a read lock
Transaction 2: insert into fk values (2);
- Checks pk table for value, finds it, gets a read lock
Transaction 1: update pk set nonkey='a' where key=2;
- Wants a write lock on row with pk.key=2, can't get it because
Transaction 2 has a read lock. It has to wait.
Transaction 2: update pk set nonkey='a' where key=1;
- Wants a write lock on row with pk.key=1, can't get it because
Transaction 1 has a read lock. It has to wait.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Jon Swinth | 2003-01-16 23:05:50 | Re: Fix FK deadlock, but no magic please |
| Previous Message | Jon Swinth | 2003-01-16 22:23:24 | Re: Fix FK deadlock, but no magic please |