很抱歉提出这个问题,但是搜索此问题后我找不到任何有用的答案。
我知道在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()
有人可以帮忙吗?非常感谢! ^ _ ^
答案 0 :(得分:0)
根据文档,ResultProxy
具有属性rowcount
。您可以从中获取受影响的行。
但请注意:
此属性返回匹配的行数,不一定与实际修改的行数相同-例如,如果给定的SET值为,则UPDATE语句在给定的行上可能没有净变化。与该行中已经存在的相同。这样的行将被匹配但不会被修改。在同时具有两种样式的后端(例如MySQL)上,默认情况下将rowcount配置为在所有情况下都返回匹配计数。
另请参见here,以获取有关Mike Bayer的详尽解释。