gpt4 book ai didi

python - 并发原子选择更新

转载 作者:行者123 更新时间:2023-11-28 17:37:28 25 4
gpt4 key购买 nike

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

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

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

如何同时进行?

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

我怎样才能做到这一点?

我做错了吗?

应该是存储过程吗?

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

最佳答案

您可以通过设置一个 isolation level 来做到这一点可序列化的,可以是done on a specific session with SQLAlchemy使用 session.connection(execution_options={'isolation_level': 'SERIALIZABLE'})。如果两个连接发生冲突(它们都先读后写),提交事务将失败,您可以循环直到它通过。

from sqlalchemy import Column, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.types import Boolean, Integer, String


Base = declarative_base()

class User(Base):
__tablename__ = 'users'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
active = Column(Boolean, nullable=False)


url = 'postgresql://postgres@localhost/test'
engine = create_engine(url, echo=True)
if not engine.dialect.has_table(engine.connect(), 'users'):
Base.metadata.create_all(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add(User(name="remram", active=True))
session.commit()

Session = sessionmaker(bind=engine)
session = Session()
session.connection(execution_options={'isolation_level': 'SERIALIZABLE'}) # Commenting this line will make this unsafe in a concurrent environment

user = session.query(User).filter(User.name == "remram").one()
if user.active:
user.active = False
raw_input() # So you can run this twice
session.commit()

关于python - 并发原子选择更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29019601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com