2009-08-18 68 views
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進程,它們都會更新相同的記錄。我不確定我是否正確創建了連接/會話/事務。任何指針?

回答

1

要麼使您的事務隔離級別可序列化,要麼通過query.with_lockmode('update')獲取記錄以進行更新。