2
我想要一個表(隊列)中的記錄被選中,鎖定(沒有其他進程可以編輯此記錄)並在稍後的時間點更新。
我假設我把整個查詢和更新放在一個事務中,其他進程不能編輯/查詢同一條記錄。但我不能完全實現這一點。SQLAlchemy(Postgres)和事務
def move(one, two):
from settings import DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy import create_engine
engine = create_engine('postgres://%s:%[email protected]%s:%s/%s' % (DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME), echo = False)
conn = engine.connect()
tran = conn.begin()
Session = scoped_session(sessionmaker())
session = Session(bind=conn)
url = session.query(URLQueue).filter(URLQueue.status == one).first()
print "Got record: " + str(url.urlqueue_id)
time.sleep(5)
url.status = two
session.merge(url)
session.close()
tran.commit()
move('START', 'WIP')
如果我開始2進程,它們都會更新相同的記錄。我不確定我是否正確創建了連接/會話/事務。任何指針?