2010-01-25 4 views
5

Я использую web2py для подключения своего веб-сайта. Я решил использовать web2py DAL для долгосрочной программы, которая работает за сайтом. Эта программа, похоже, не обновляет свои данные или базу данных (иногда).DAL без 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() 

Он не обновляет базу данных и не выбирает по заказу с этим идентификатором, показывает правильные данные. В некоторых случаях «db.rollback()» после фиксации, похоже, помогает.

Очень странно сказать наименее. Вы видели это? Что еще важнее, вы знаете решение?


UPDATE:
Исправление: Выбор: в вопросе делается в рамках программы, а не за ее пределами.

Иногда, когда вы делаете серию обновлений, некоторые из них будут работать и быть доступны снаружи, а некоторые будут недоступны. Также некоторые запросы возвратят данные, которые они изначально вернули, даже если данные имеют изменения в БД с первого запроса.

У меня возникает соблазн свалить этот подход и перейти к другому методу, любые предложения?

+0

виду, что объект БД не могут быть разделены между потоками. – mdipierro

ответ

2

Эта проблема была решена: MySQL работает на уровне изоляции Многократное чтение (то есть, как только начинается операция, данные отражены в выбранном выходе не изменится, пока транзакция завершается). Необходимо было изменить уровень изоляции для ЧТЕНИЯ КОМИТЕТА и решить эту проблему. Кстати, READ COMMITED - это уровень изоляции, по которому Oracle и mssql работают по умолчанию. Это может быть установлено в my.cnf. Подробности в ссылке ниже:

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