我想要一个表(队列)中的记录被选中,锁定(没有其他进程可以编辑此记录)并在以后更新。
我假设如果我将整个查询和更新放在一个事务中,没有其他进程可以编辑/查询相同的记录。但我无法实现这一目标。
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:%s@%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个进程,它们都会更新相同的记录。我不确定我是否正确创建了连接/会话/事务。有什么指针吗?
答案 0 :(得分:1)
使您的事务隔离级别可序列化,或通过query.with_lockmode('update')获取更新记录。