DAL без web2py

Я использую web2py для управления своим веб-сайтом. Я решил использовать 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()

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

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


ОБНОВЛЕНИЕ:
Исправление: рассматриваемый выбор выполняется внутри программы, а не вне ее.

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

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


person Jay    schedule 25.01.2010    source источник
comment
Имейте в виду, что объект db не может быть разделен между потоками.   -  person mdipierro    schedule 25.01.2010


Ответы (1)


Эта проблема устранена: mysql работает на уровне изоляции REPEATABLE READ (то есть после начала транзакции данные, отраженные в выводе select, не изменятся до завершения транзакции). Требовалось изменить уровень изоляции на READ COMMITED, и это решило проблему. Кстати, READ COMMITED — это уровень изоляции, на котором Oracle и mssql работают по умолчанию. Это можно установить в файле my.cnf. Подробности по ссылке ниже:

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

person Jay    schedule 26.01.2010