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://[EMAIL PROTECTED]/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 -- http://mail.python.org/mailman/listinfo/python-list