[DB-SIG] Any standard for two phase commit APIs?

James Henstridge james at jamesh.id.au
Fri Jan 18 13:05:39 CET 2008


On 18/01/2008, M.-A. Lemburg <mal at egenix.com> wrote:
> While this would seem desirable, it is not how the Zope TM
> works.
>
> Phase 1 is implemented by doing a vote on the success
> of the transaction. Phase 2 then finishes or aborts the transaction
> depending on the vote.
>
> If something fails in phase 2, there's no guarantee that partial
> commits can be undone.
>
> The .commit()/.rollback() calls on the database interface would
> be implemented in the phase 2 part.
>
> To avoid your scenario, the ZODB would have to detect the conflict
> during phase 1 (ie. the voting phase).

Looking at the IDataManager API, it looks like it looks like the
correct way to implement two phase commit would be:

1. if tpc_begin() is called, note that two-phase commit is being used.
2. in commit(), simply prepare the transaction if the two-phase commit
flag is set, rather than actually committing.  If this fails, the
transaction obviously fails.
3. make tpc_vote() a no-op.
4. tpc_finish() commits the prepared transaction
5. abort() and tpc_abort() roll back the prepared transaction (if one
was prepared).

James.


More information about the DB-SIG mailing list