[ZODB-Dev] breaking out the transaction module from ZODB

Chris McDonough chrism at plope.com
Thu Nov 8 13:59:47 EST 2007


On Nov 8, 2007, at 9:14 AM, Jim Fulton wrote:
>>  class TransactionFailedError(Exception):
>>      """Cannot perform an operation on a transaction that  
>> previously failed.
>>
>>      An attempt was made to commit a transaction, or to join a  
>> transaction,
>>      but this transaction previously raised an exception during an  
>> attempt
>>      to commit it.  The transaction must be explicitly aborted,  
>> either by
>>      invoking abort() on the transaction, or begin() on its  
>> transaction
>>      manager.
>>      """
>
> Why not subclass TransactionError?

It didn't before.  Should it?  There's also a DoomedTransaction  
exception in the interfaces package that could.
>>
>>  TransactionError.__bases__ += (POSError,)
>>  TransactionFailedError.__bases__ += (POSError,)
>
> Is this *really* necessary?  It's obviously a bit evil.  Let's  
> explore alternatives to this:
>
> 1. Just don't do it.  I'd be a bit surprised if there was code  
> actually catching POSError.

Me too; +1.  If I notice anything relying on them inheriting from  
POSError, I'll move POSError into the transaction module.

>> - I've created a zc.zodbutils package that is essentially the code  
>> that currently lives in
>>  the ZODB.utils module; I've also moved the TimeStamp.c code that  
>> currently lives
>>  in 'persistent' into it.  A stub ZODB.utils module exists that  
>> just does
>>  "from zc.zodbutils import *", and in the persistent package's  
>> __init__.py, I
>>  do "from zc.zodbutils import TimeStamp" for backwards compatibility.
>
> I'd rather not do this.  Let's be a bit more selective here.  The  
> number of imports from ZODB are pretty limited. Many of them should  
> move to transaction.  Some of them are just test utilities that can  
> be duplicated.
>
> I think the biggest challenge is WeakSet.  This could be broken out  
> into a separate package, but I think it's not as general as its name  
> implies and should probably just be moved to transaction.

OK.

>>  And I'm thinking that the transaction distribution should be named  
>> just "transaction".
>
> Yes, unless we decide to move the package.  I think transaction is a  
> bit presumptuous. :)

How about "zope.transaction"?  There's a good deal of 3rd-party code  
that does "import transaction" but we could supply a module alias for  
this purpose.  We'd just change the Z2 and Z3 appserver distributions  
to do "import zope.transaction as transaction" or whatever, and have  
the appserver distributions depend on a shim "transaction" module or  
module alias or whatever too so 3rd-party code would continue to work,  
maybe making imports using them issue a deprecation warning?

- C



More information about the ZODB-Dev mailing list