在SQLAlchemy中,如何在使用乐观锁进行更新后获取受影响的行?

时间:2018-12-26 13:41:48

标签: python sqlalchemy

很抱歉提出这个问题,但是搜索此问题后我找不到任何有用的答案。

我知道在SQLAlchemy的会话中,update()将无法正常工作,甚至可能无法与数据库通信,直到您使用session.commit

这是我的代码,我认为我使用的技能称为optimistic lock

with Session() as session:
    # get one record
    object = session.query(Table).where(key=param).limit(1)

    content = "here is the calculated value of my business"

    # update the record by the id of the gotten record 
    # if 2 thread get the same record and run into this update statement, I think only can success
    # because it is ensured by the MySQL MVCC
    Table.update(Table).set(Table.content = content).where(id = object.id)
    sessoin.commit()

但是我在这里有一个问题,如果我想在in the thread which got the lock之后做session.commit()怎么办?

例如,我期望的代码如下:

affected_rows = sessoin.commit()
if affected_rows:
    do_something_after_get_lock_success()

有人可以帮忙吗?非常感谢! ^ _ ^

1 个答案:

答案 0 :(得分:0)

根据文档,ResultProxy具有属性rowcount。您可以从中获取受影响的行。

但请注意:

  

此属性返回匹配的行数,不一定与实际修改的行数相同-例如,如果给定的SET值为,则UPDATE语句在给定的行上可能没有净变化。与该行中已经存在的相同。这样的行将被匹配但不会被修改。在同时具有两种样式的后端(例如MySQL)上,默认情况下将rowcount配置为在所有情况下都返回匹配计数。

另请参见here,以获取有关Mike Bayer的详尽解释。