[DB-SIG] Two-phase commit API proposal (was Re: Any standard for two phase commit APIs?)
M.-A. Lemburg
mal at egenix.com
Wed Jan 23 15:24:35 CET 2008
On 2008-01-23 14:11, Stuart Bishop wrote:
> M.-A. Lemburg wrote:
>> So we do need to store the "formatID" as well ?
>
> It looks like yes we do. MySQL's syntax for xids allows an optional formatid
> and this is returned by XA RECOVER. In MySQL, it is a number rather than a
> string. Assuming that any system that uses more than a simple string for the
> xid is doing so to map onto the XA specification, we could safely represent
> xids as a 3-tuple of (unicode, unicode, integer).
>
> How to deal with None's and empty strings needs to be thought out though to
> avoid round trip edge cases:
>
>>>> con = connect('')
>>>> xid = ('g', '', None)
>>>> con.tpc_begin(xid)
>>>> con.tpc_prepare()
>>>> con.tpc_recover()
> [('g', None, 1)]
>>>> con.tpc_recover()[0] == xid
> False
>
> '' and None for the gtid and brid would be equivalent, and 1 and None would
> be equivalent for the format_id (1 is the default format id in MySQL). To
> avoid round trip issues with tuples, only one of these values should be allowed.
>
> If we use an object, these issues go away:
I'm not sure I understand... a tuple *is* an object after all :-)
Why does '' get converted to None on output ?
The database module
should not try to change the object in any way (regardless of whether
it's a string, tuple, custom sequence like object, etc.). At least
that's the theory.
Or is this a side-effect of MySQL doing some internal mapping of
the tuple contents to some internal table ?
>>>> con = connect('')
>>>> xid = Xid('g', '')
>>>> tuple(xid)
> ('g', None, 1)
>>>> con.tpc_begin(xid)
>>>> con.tpc_prepare()
>>>> con.tpc_recover()
> [<Xid 'g', None, 1>]
>>>> con.tpc_recover()[0] == xid
> True
>
>> Given that the formatID is used for some purpose as well (probably
>> just as identification of the TM itself), I guess we'd have
>> to use a 3-tuple (format id, global transaction id, branch id).
>>
>> Modules should only expect to find an object that behaves like
>> a 3-sequence, they should accept whatever object is passed to
>> them and return it for the recover method.
>>
>> This leaves the door open for extensions used by the TM for XID
>> objects.
>
> I don't see a technical problem with the tuple apart from the round tripping
> issue above and someone might have a nice solution to that. Subjectively, I
> think an object reads better though, particularly as in many cases you will
> only want to bother specifying one or maybe two of the three parts.
> Xid('foo') vs. ('foo', None, None).
I think we shouldn't restrict the TM by specifying a particular
object. After all, the DB-API is about the RM, not the TM.
However, it may be worthwhile to have the RM at least peek
into the XID object and that's why I think we should require
the XID object to implement the __getitem__ protocol and
have the first three positions defined as (format id,
global transaction id, branch id).
This should leave enough room for the TM.
> Is CamelCase of xid 'Xid' or 'XID' or 'XId' ?
Good question. XID itself is an abbreviation. I tend to
leave those alone and use all-capital-letters for classes.
Note that since the TM will create the XIDs, we don't need
to worry about a method or API to generate them.
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Jan 23 2008)
>>> Python/Zope Consulting and Support ... http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
More information about the DB-SIG
mailing list