2010-01-25 8 views
5

Używam web2py do zasilania mojej witryny. Zdecydowałem się użyć DALO web2py dla długiego programu działającego pod tą stroną. Ten program nie wydaje się aktualizować swoich danych lub bazy danych (czasami).DAL bez 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() 

Nie aktualizuje bazy danych, a wybór dla zamówień o tym identyfikatorze pokazuje poprawne dane. W niektórych okolicznościach pomocna może okazać się funkcja "db.rollback()" po zatwierdzeniu.

Bardzo dziwnie, delikatnie mówiąc. Widziałeś to? Co ważniejsze znasz to rozwiązanie?


UPDATE:
Korekta: select mowa odbywa się w ramach programu, a nie poza nim.

Czasami, podczas wykonywania szeregu aktualizacji, niektóre będą działać i będą dostępne na zewnątrz, a inne nie będą dostępne. Również niektóre zapytania zwrócą dane, które zostały pierwotnie zwrócone, nawet jeśli dane zawierają zmiany w DB od czwartego oryginalnego zapytania.

Mam pokusę, aby rzucić to podejście i przejść do innej metody, wszelkie sugestie?

+0

pamiętać, że obiekt db nie mogą być współużytkowane przez wątkach. – mdipierro

Odpowiedz

2

Ten problem został rozwiązany: mysql działa na poziomie izolacji powtarzalne ZOBACZ (czyli po rozpoczęciu transakcji, dane odzwierciedlenie w wybranej wyjścia nie zmieni aż zakończeniu transakcji). Wymagało to zmiany poziomu izolacji na READ COMMITED i to rozwiązało problem. Przy okazji READ COMMITED jest poziomem izolacji, przy którym domyślnie działają Oracle i mssql. Można to ustawić w my.cnf. Szczegóły w linku poniżej:

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