SQLAlchemy(Postgres)与事务

2 投票
1 回答
1703 浏览
提问于 2025-04-15 13:41

我想从一个表(队列)中选取一条记录,然后把它锁定(这样其他进程就不能编辑这条记录),并在稍后的时间进行更新。
我以为如果把查询和更新的操作放在一个事务里,就不会有其他进程可以编辑或查询同一条记录。但我现在还没有做到这一点。

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')

如果我同时启动两个进程,它们都会更新同一条记录。我不确定我是否正确创建了连接、会话和事务。有没有什么建议?

1 个回答

1

要么把你的事务隔离级别设置为可串行化,要么通过查询来获取要更新的记录,并使用锁定模式'更新'。

撰写回答