From: | Jonathan Guthrie <jguthrie(at)brokersys(dot)com> |
---|---|
To: | Craig Ringer <craig(at)postnewspapers(dot)com(dot)au> |
Cc: | "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: I'm puzzled by a foreign key constraint problem |
Date: | 2008-11-04 20:34:32 |
Message-ID: | 1225830872.3821.152.camel@localhost.localdomain |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Wed, 2008-11-05 at 04:40 +0900, Craig Ringer wrote:
> The point is that if your initial create and the setting of the initial
> permissions must succeed or fail together, they MUST be done within a
> single transaction. That is, in fact, the fundamental point of database
> transactions.
I understand that. Honestly, I do. If I hadn't ever said that odd
things happen when the permissions aren't set, then maybe I could find
out what I'm doing wrong.
> What you should avoid doing is:
>
> TRANSACTION 1 TRANSACTION 2
>
> BEGIN;
> BEGIN;
> SELECT create_it(blah);
> SELECT set_permissions(blah, perms);
> COMMIT;
> COMMIT;
>
> ... because that just won't work. It sounds like you've got that right,
> but you might be doing this:
> TRANSACTION 1 TRANSACTION 2
>
> BEGIN;
> BEGIN;
> SET transaction_isolation = SERIALIZABLE;
> -- do something else that triggers
> -- freezing of the transaction's snapshot,
> -- even something like:
> SELECT 1;
> SELECT create_it(blah);
> COMMIT;
> SELECT set_permissions(blah, perms);
> COMMIT;
>
> ... which will also fail.
The thing is, the C++ code does this
BEGIN transaction 1
INSERT project
COMMIT
BEGIN transaction 2
SET permissions
COMMIT
or, at least, it's supposed to. Those two operations are not supposed
to overlap at all even if they're on two different connections. I
thought I had verified this by looking at the log file. I mean, I can
look at the log file and see things like
2008-11-03 16:29:22 CST DEBUG: 00000: StartTransactionCommand
and
2008-11-03 16:29:22 CST DEBUG: 00000: CommitTransactionCommand
where I would expect them to if what I'm expecting is going on, but the
log file doesn't appear to have enough information to see a transaction
created, proceed, and then end. That is, how do I know which
transaction was started and which one was committed?
I'm kind of confused by lines like this:
2008-11-03 16:29:22 CST DEBUG: 00000: name: unnamed; blockState: INPROGRESS; state: INPROGR, xid/subid/cid: 678145/1/4, nestlvl: 1, children: 678146 678147
Is there an easy explanation somewhere?
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Allison | 2008-11-04 21:02:27 | Re: postgresql and Mac OS X |
Previous Message | Steve Atkins | 2008-11-04 20:07:17 | Re: Semi-customized queries? Subset of SQL? Accessing the parser? Injection? |