On Thu, Jul 10, 2008 at 12:12:06AM -0400, Paul Winkler wrote:
> Hi,
> 
> I noticed that Zope 2.11 includes a recent version of the transaction
> module including the transaction.doom() method.  But I don't see any
> check for it in ZPublisher.
> 
> So, if any code calls transaction.doom(), the publisher will raise a
> user-visible exception when it tries to call commit().  This seems
> less than useful :-)
> 
> In the discussion I've seen of this method, eg.
> https://bugs.launchpad.net/zope3/+bug/98382 and
> http://markmail.org/message/3yshpmltvhevnrff it sounds like other
> people share my expectation... namely, that the developer should not
> have to do anything special after calling transaction.doom(); the
> transaction is not committed, and the user won't see an exception.

Yes.

> 
> Is that the concensus? If so, there's an easy solution -
> apply something like the attached patch.
> 
> Anybody disagree?

I havn't investigated properly, but it may be necessary to do the
isDoomed() check at a higher level where you can abort. Code running
after the commit() expects a new transaction and now will not get that.

Other than that, an explicit abort() if the transaction is doomed may be
sufficient.

Zope3 does:

     def afterCall(self, request, ob):
         txn = transaction.get()
        if txn.isDoomed():
            txn.abort()
        else:
            self.annotateTransaction(txn, request, ob)
            txn.commit()

> 
> 
> -- 
> 
> Paul Winkler
> http://www.slinkp.com

> --- Zope2/App/startup.py~     2008-06-14 02:50:23.000000000 -0400
> +++ Zope2/App/startup.py      2008-07-10 00:08:02.000000000 -0400
> @@ -267,7 +267,8 @@
>          transaction.begin()
>  
>      def commit(self):
> -        transaction.commit()
> +        if not transaction.isDoomed():
> +            transaction.commit()
>  
>      def abort(self):
>          transaction.abort()
> --- ZPublisher/Publish.py~    2008-06-14 02:50:48.000000000 -0400
> +++ ZPublisher/Publish.py     2008-07-10 00:08:08.000000000 -0400
> @@ -314,7 +314,8 @@
>      def begin(self):
>          transaction.begin()
>      def commit(self):
> -        transaction.commit()
> +        if not transaction.get().isDoomed():
> +            transaction.commit()
>      def abort(self):
>          transaction.abort()
>      def recordMetaData(self, object, request):
> --- ZPublisher/WSGIPublisher.py~      2008-06-14 02:50:48.000000000 -0400
> +++ ZPublisher/WSGIPublisher.py       2008-07-09 23:59:57.000000000 -0400
> @@ -401,7 +401,8 @@
>      def begin(self):
>          transaction.begin()
>      def commit(self):
> -        transaction.commit()
> +        if not transaction.get().isDoomed():
> +            transaction.commit()
>      def abort(self):
>          transaction.abort()
>      def recordMetaData(self, object, request):

> _______________________________________________
> Zope-Dev maillist  -  Zope-Dev@zope.org
> http://mail.zope.org/mailman/listinfo/zope-dev
> **  No cross posts or HTML encoding!  **
> (Related lists - 
>  http://mail.zope.org/mailman/listinfo/zope-announce
>  http://mail.zope.org/mailman/listinfo/zope )


-- 
Brian Sutherland
_______________________________________________
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )

Reply via email to