表格宽度最大值+ 1,增量唯一

时间:2015-09-02 16:15:21

标签: python mysql sqlalchemy

我有以下表格:

$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递增?

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一方法是将整个表锁定在插入上。任何其他方法都将成为竞争条件或唯一性违规的牺牲品。你最好把它作为原始sql的触发器而不是试图让它在sql炼金术中工作。

注意:如果您在该列上有索引,则您的方法可能无效,因为不是必须读取所有行以标识最大值。导致只有1行被锁定。见SELECT FOR UPDATE