我有以下表格:
$text = '100% nach schriftl. Zusage, ohne Zusage auch bei
<span style="background-color:rgb(255,255,187)">Notfalleinweisung und</span> einziger benötigter
<span style="background-color:rgb(255,255,187)">Behandlungsmöglichkeit.</span>';
$this->writeHTML($text);
该程序的实例是在程序中的某处创建的。之后,在创建之后的某个时刻(这就是为什么我不能使用主键),我想将$("#id").jstree()
设置为其表格最大值+ 1.我的想法是使用update_id用于比较首先更新的对象。
我的问题:如何在竞争条件下确保这一点? 例如,虽然实例A得到最大值来增加它,但另一个实例B得到的相同,并且两者最终会得到相同的值(除了值必须是唯一的这一事实)?
我在MyTable中尝试了以下方法:
Base = declarative_base()
class MyTable(Base):
id = Column(Integer, primary_key=True)
update_id = Column(Integer, unique=True)
在提交之前持有(upload_id
)代码并尝试为另一个实例调用该方法时,在第一次调用之后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
{{ 1}}被执行了。
注意:我找到了将值安全地增加一个的解决方案,但我的观点是(这就是为什么我认为这不是重复的问题):我该怎么做按列的最大值+ 1递增?
答案 0 :(得分:0)
执行此操作的唯一方法是将整个表锁定在插入上。任何其他方法都将成为竞争条件或唯一性违规的牺牲品。你最好把它作为原始sql的触发器而不是试图让它在sql炼金术中工作。
注意:如果您在该列上有索引,则您的方法可能无效,因为不是必须读取所有行以标识最大值。导致只有1行被锁定。见SELECT FOR UPDATE