I had problems with sqlobject's doInTransaction() in the past. Ian wrote
the following for me which I have been using successfully.
def doInTransaction(func, *args, **kw):
"""
This routine can be used to run a function in a transaction,
rolling the transaction back if any exception is raised from
that function, and committing otherwise.
Use like::
doInTransaction(process_request, os.environ)
This will run ``process_request(os.environ)``. The return
value will be preserved.
"""
old_conn = sqlhub.getConnection()
conn = old_conn.transaction()
sqlhub.threadConnection = conn
try:
try:
value = func(*args, **kw)
except:
conn.rollback()
raise
else:
conn.commit()
return value
finally:
sqlhub.threadConnection = old_conn
### /end doInTransaction ###
Hope this helps.
--
Rick
On Thu, 15 Mar 2007, sophana wrote:
> Hi
>
> I'm testing transactions with sqlobject.
> I found the doInTransaction method
>
> so I made a test:
> (python2.4 sqlobject 0.8.0 mysql innodb table)
>
> class TestSql(SQLObject):
> k = IntCol(default=None)
> v = IntCol(default=None)
>
>
> def init():
> TestSql.dropTable()
> TestSql.createTable(ifNotExists=True)
>
> TestSql(k=1,v=1)
> TestSql(k=2,v=2)
>
> def inc(k):
> a=TestSql.select(TestSql.q.k==k,forUpdate=True)[0]
> sleep(0.1)
> a.v += 1
>
> def go2(k):
> for a in range(100):
> sqlhub.doInTransaction(inc,k)
>
> go2(1)
>
> At the end, I have an sql error saying that there is no more connection
> possible. There are indeed 100 processes sleeping.
> What is creating all these connections?
>
> Now some more questions. What is the difference between
> - using a transaction object
> - simply using connection.query('begin;') and connection.query('commit;')
>
> example:
>
> def inc(k):
> connection.query('begin;')
> a=TestSql.select(TestSql.q.k==k,forUpdate=True)[0]
> sleep(0.1)
> a.v += 1
> connection.query('commit;')
>
> this works just fine. Any problem with this approach? Isn't it optimal
> and thread safe?
>
> What about the cache? Do I have to add in sqlmeta: cacheValues=False?
> When doing this, I saw the debug log and it is terribly not efficient.
>
> I tested this with 2 process and it was ok. Is it ok with 1
> multithreaded process?
> My application has 2 multithreaded (web server) process over 2 distant
> replicated mysql databases.
> I've read somewhere that mysql transaction should work with replicated
> databases.
>
> Thanks for your help
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys-and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> sqlobject-discuss mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss
>
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
sqlobject-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss