On Aug 23, 2007, at 6:35 PM, johnf wrote:

> But I changed my code to force the correct sequence and I still got  
> an error
> from Dabo.   So I thought I'd ask about how it is suppose to work when
> children are involved.

        There are two approaches: pre-fetching the next sequence and setting  
the PK of your new parent record to it *before* the insert (we'll  
call this 'pregen'), and inserting the record without a PK value, and  
then asking the database what value it gave the PK (call this  
'postgen').

        Currently dbPostgreSQL uses the postgen strategy, but if I  
understand your explanation of the problem you're now having, you  
cannot ask Postgres what is the value of the last assigned PK until  
after the transaction has been committed. As a result, you cannot  
populate the FKs of the child records without first committing the  
parent insert, which means that ACID transactions are not possible.

        The approach you need to use, if indeed you cannot query the  
database for a newly-inserted PK while a transaction is pending, is  
to use a pregen approach. In this case, the parent PK is gotten  
before the insert, and thus is available for populating child FKs  
while still wrapped in the transaction.

        The way that Dabo handles this is by defining a method in the  
dBackend subclass named 'pregenPK()'. If that returns a non-empty  
value, the PK of the record to be inserted will be set *before* the  
insert is made, and the post-insert call to getLastInsertID() is  
skipped.

        Does this make the flow of events any clearer?

-- Ed Leafe
-- http://leafe.com
-- http://dabodev.com




_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev
Searchable Archives: http://leafe.com/archives/search/dabo-dev
This message: http://leafe.com/archives/byMID/dabo-dev/[EMAIL PROTECTED]

Reply via email to