gpt4 book ai didi

python - 唯一增量及其表宽最大值 + 1

转载 作者:行者123 更新时间:2023-11-30 22:36:39 25 4
gpt4 key购买 nike

我有如下表格:

Base = declarative_base()
class MyTable(Base):
id = Column(Integer, primary_key=True)
update_id = Column(Integer, unique=True)

该表的一个实例是在程序运行期间的某处创建的。后来,在创建后的某个时刻(这就是为什么我不能使用主键),我想将 upload_id 设置为其表宽最大值 + 1。这个想法是使用update_id 比较哪个对象先被更新。

我的问题:我如何确保它不受竞争条件的影响?例如,虽然实例 A get 是递增它的最大值,但另一个实例 B get 是相同的,并且两者最终都会得到相同的值(除了值必须是唯一的事实之外)?

我在MyTable中尝试了以下方法:

def set_update_id(self):
q = database.session.query(func.max(MyTable.upload_id) + 1)
new_id = q.with_for_update().scalar()
if new_id is None:
new_id = 1
self.upload_id = new_id
database.session.commit()

当持有 (set_trace) 提交前的代码并尝试为不同的实例调用该方法时,我在尝试获取锁时发现 Deadlock found;在执行第一次调用的 commit 后,尝试为第二次调用重新启动事务

注意:我找到了安全地将值递增 1 的解决方案,但我的观点是(这就是为什么我认为这不是一个重复的问题):如何递增最大值+ 1 列?

最佳答案

唯一的方法是在插入时锁定整个表。任何其他方法都将成为竞争条件或违反唯一性的牺牲品。你最好在原始 sql 中将其实现为触发器,而不是试图让它在 sql alchemy 中工作。

注意:如果您在该列上有索引,则您的方法可能不起作用,因为并非必须读取所有行才能确定最大值。导致只有 1 行被锁定。参见 SELECT FOR UPDATE

关于python - 唯一增量及其表宽最大值 + 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358131/

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