6

web2py を使用して Web サイトを強化しています。私は、サイトの背後で実行される長期実行プログラムに web2py DAL を使用することにしました。このプログラムは、データまたはデータベースを更新していないようです (時々)。

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

from locdb import * 
# contains
# db = SQLDB("mysql://user/pw@localhost/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()」が役立つようです。

控えめに言っても非常に奇妙です。これを見たことがありますか?さらに重要なのは、解決策を知っていますか?


更新:
訂正: 問題の選択は、プログラムの外部ではなく、プログラム内で行われます。

一連の更新を行うと、一部は機能して外部で利用できるようになり、一部は利用できなくなることがあります。また、一部のクエリは、th4 元のクエリ以降に DB でデータが変更された場合でも、最初に返されたデータを返します。

私はこのアプローチを捨てて別の方法に移りたいと思っています。何か提案はありますか?

4

1 に答える 1

3

この問題は解決され ました。mysql は分離レベル REPEATABLE READ で実行されます (つまり、トランザクションが開始されると、選択出力に反映されるデータはトランザクションが終了するまで変更されません)。分離レベルを READ COMMITED に変更する必要があり、問題は解決しました。ちなみに、READ COMMITED は、Oracle と mssql が既定で実行される分離レベルです。これはmy.cnfで設定できます。以下のリンクの詳細:

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

于 2010-01-26T02:33:49.633 に答える