SQLObject transaction rollback not working

jacob.miles at gmail.com jacob.miles at gmail.com
Tue Nov 29 01:03:42 EST 2005


Hello.  I'm trying to wrap a function call in a transaction, but when I
intentionally throw an exception in the middle of the function it
doesn't actually roll back the transaction.  The debug output says
1/ROLLBACK, without any 1/COMMITs in there, but when I view the data in
the command-line mysql utility the changes have been made.

This is the code I'm using to connect to the mysql database and to wrap
the function call in a transaction.  After that I've invluded the
testUpdate method I'm using, and after that the python conversation
that ensued.  Does anyone see what I'm doing wrong?

--- sqlutil.py:

from sqlobject import *

def connect():
    """ Connects SQLObject to the dev database on localhost.
    """
    connectionString =
"mysql://admin@localhost/mc_image_library_dev?debug=1"
    connection = connectionForURI (connectionString)
    sqlhub.processConnection = connection


def wrapInTransaction (func, *args, **kw):
    """ Got this from the SQLObject mailing list.
    Calls the given func with the given args and keyword assignments
    within a db transaction.  Rolls back if an exception is thrown,
    otherwise commits.
    """
    old_conn = sqlhub.getConnection()
    conn = old_conn.transaction()
    sqlhub.processConnection = conn
    try:
	try:
	    value = func(*args, **kw)
	except:
	    conn.rollback()
	    raise
	else:
	    conn.commit()
	    return value
    finally:
	sqlhub.processConnection = old_conn

------------------
----- test.py:

from ImageCategory import *

def testUpdate (newName, username, fail):
    category = ImageCategory.get(1)
    category.name = newName
    category.updateLastChanged (username)
    if fail:
	raise Exception ('spam', 'eggs')

-----------------
------ The python conversation:

>>> import sqlutil
>>> sqlutil.connect()
>>> import test
>>> sqlutil.wrapInTransaction (test.testUpdate, 'Animals', 'jake', True)
 1/QueryOne:  SELECT last_changed_by, last_changed_date, name FROM
image_category WHERE id = 1
 1/Query   :  UPDATE image_category SET name = 'Animals' WHERE id = 1
 1/Query   :  UPDATE image_category SET last_changed_by = 'jake' WHERE
id = 1
 1/Query   :  UPDATE image_category SET last_changed_date = '2005-11-29
00:36:22' WHERE id = 1
 1/ROLLBACK:
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "sqlutil.py", line 22, in wrapInTransaction
    value = func(*args, **kw)
  File "test.py", line 8, in testUpdate
    raise Exception ('spam', 'eggs')
Exception: ('spam', 'eggs')

------------

After all this, the mysql utility shows that the update did take
effect.

Any thoughts?

- Jake




More information about the Python-list mailing list