[ZODB-Dev] RelStorage now in Subversion

Shane Hathaway shane at hathawaymix.org
Fri Feb 1 14:32:14 EST 2008


Dieter Maurer wrote:
> Unless, you begin a new transaction on your load connection after
> the write connection was committed,
> your load connection will not see the data written over
> your write connection.

Good point.  After a commit, we *must* poll.

> This implies, the read connection must start a new transaction
> at least after a "ConflictError" has occured. Otherwise, the
> "ConflictError" cannot go away.

Also a good point.  All these details will come into play if I attempt 
to poll less often.

> What I fear is described by the following szenario:
> 
>    You start a transaction on your load connection "L".
>    "L" will see the world as it has been at the start of this transaction.
> 
>    Another transaction "M" modifies object "o".
> 
>    "L" reads "o", "o" is modified and committed.
>    As "L" has used "o"'s state before "M"'s modification,
>    the commit will try to write stale data.
>    Hopefully, something lets the commit fail -- otherwise,
>    we have lost a modification.

Yes, RelStorage uses standard ZODB conflict detection: all object 
changes must be derived from the most current state of the object in the 
database.  If any object has been changed by later transactions, 
conflict resolution is attempted, and if that fails, the transaction fails.

> I noticed another potential problem:
> 
>   When more than a single storage is involved, transactional
>   consistency between these storages requires a true two phase
>   commit.
> 
>   Only recently, Postgres has started support for two phase commits ("2PC") but
>   as far as I know Python access libraries do not yet support the
>   extended API (a few days ago, there has been a discussion on
>   "db-sig at python.org" about a DB-API extension for two phase commit).
> 
>   Unless, you use your own binding to Postgres 2PC API, "RelStorage"
>   seems only safe for single storage use.

Actually, RelStorage inherited two phase commit support from PGStorage. 
  The 2PC API is accessible through psycopg2 if you simply issue the 
transaction control statements yourself.

Shane



More information about the ZODB-Dev mailing list