2010-01-25 50 views
5

我使用web2py来为我的网站供电。我决定将web2py DAL用于在网站后面运行的长时间运行的程序。 该程序似乎没有更新其数据或数据库(有时)。DAL without web2py

from gluon.sql import * 
from gluon.sql import SQLDB 

from locdb import * 
# contains 
# db = SQLDB("mysql://user/[email protected]/mydb", pool_size=10) 
# db.define_table('orders', Field('status', 'integer'), Field('item', 'string'), 
# migrate='orders.table') 
orderid = 20 # there is row with id == 20 in table orders 
#when I do 
db(db.orders.id==orderid).update(status=6703) 
db.commit() 

它不会更新数据库,并且对具有此ID的订单进行选择时显示正确的数据。在某些情况下,提交后的“db.rollback()”似乎有所帮助。

很奇怪的是,至少可以说。你见过这个吗?更重要的是你知道解决方案吗?


UPDATE:
更正: 有问题的选择是在程序中完成的,而不是外面。

有时候,当进行一系列更新时,有些更新会有效并且可以在外部使用,有些则不可用。即使从原始查询开始,数据在数据库中发生变化,一些查询也会返回最初返回的数据。

我很想转储这种方法,并转移到另一种方法,有什么建议吗?

+0

记住,数据库对象不能在线程间共享。 – mdipierro 2010-01-25 14:00:28

回答

2

此问题已得到解决: mysql的隔离级别REPEATABLE READ运行(也就是,一旦交易开始,该数据反映在选择输出不会改变,直到在事务结束)。它需要将隔离级别更改为READ COMMITED并解决了问题。顺便说一句,READ COMMITED是默认运行Oracle和mssql的隔离级别。 这可以在my.cnf中设置。在下面的链接详细信息:

http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html