并发原子选择更新

gui*_*bob 8 python sql sqlalchemy

我怎样才能使用 sqlalchemy 做这样的事情?

user = session.query("select * from user")
if user.state == "active"
    session.query("update user set state = 'inactive' where id = %d" % user.id)
Run Code Online (Sandbox Code Playgroud)

我需要将选择和更新作为一项原子操作。在操作进行时,另一个程序不应该能够选择/更新用户。

我怎样才能同时做到这一点?

注意:我需要知道我们是否成功改变了状态。

我怎样才能做到这一点?

我做错了吗?

它应该是一个存储过程吗?

我应该使用数据库“锁”吗?

Mag*_*ato 2

如果您的数据库支持SELECT FOR UPDATE (即:PostgreSQL),您可以使用:

user = session.query("select * from user where id = %d for update" % theId)
if user.state == "active"
    session.query("update user set state = 'inactive' where id = %d" % user.id)
Run Code Online (Sandbox Code Playgroud)

  • SELECT FOR UPDATE 锁定该行,以便仅允许当前事务对其进行修改。其他事务可以 SELECT 它,但如果它们尝试 SELECT FOR UPDATE、UPDATE 或 DELETE,它们将会阻塞。它充当信号量,使得这一段代码一次只能由一个事务执行。 (2认同)