当前位置: 首页 > 面试题库 >

sqlalchemy并发更新问题

翟棋
2023-03-14
问题内容

我有一个表,jobs与领域idrank和日期时间started在一个MySQL的InnoDB数据库。

每次流程获得一项工作时,它都会“签出”该工作以将其标记为已开始,以便其他任何流程都无法对其进行处理。

我希望一个会话的单个过程能够:

  1. 寻找排名最高的工作
  2. 将此作业的开始字段更新为当前时间戳

而不会冒任何其他会话也可以选择并开始排名最高的工作的风险。其他会议也随时改变排名。

这是我的尝试:

session.execute("LOCK TABLES jobs READ")
next_job = session.query(Jobs).\
    filter(Jobs.started == None).\
    order_by(Jobs.rank.desc()).first()

# mark as started
smt = update(Jobs).where(Jobs.id == next_job.id).\
    values(started=datetime.now())
session.execute(smt)
session.execute("UNLOCK TABLES")

但这失败了:

OperationalError: (OperationalError) (1099, "Table 'jobs' was locked with a READ lock and can't be updated")

无论如何,我宁愿以SQLAlchemy提供的更加Python化的方式来执行此操作。我怎样才能做到这一点?

编辑:澄清一下,我说的是数据库中的读/写并发,而不是线程/进程同步。我的工作人员将分布在整个网络中。


问题答案:

锁桌子不好。您可以在选择时锁定该行。

以下代码使用with_lockmode():

try:
    job = session.query(Jobs).with_lockmode('update').filter(
         Jobs.started == None).first()
    # do something
    session.commit()
except Exception as exc:
    # debugs an exception
    session.rollback()

您可能希望将其放入while循环中,然后重试几次(并在尝试77次后退出紧急状态?)。



 类似资料:
  • 问题内容: 假设表有三列:,和。 当用户尝试登录时,将使用查询之类的内容检查条目 如果密码匹配,他将继续。我想做的是计算用户登录的次数。因此,只要他成功登录,我就希望增加该字段并将其存储回用户表。我不确定如何使用SqlAlchemy运行更新查询。 问题答案:

  • 问题内容: 如何更新行的信息? 例如,我想更改ID为5的行的名称列。 问题答案: 使用Flask-SQLAlchemy文档中显示的教程来检索对象。拥有要更改的实体后,请更改实体本身。然后,。 例如: Flask- SQLAlchemy基于SQLAlchemy,因此请务必同时查看SQLAlchemy文档。

  • 问题内容: 我正在将SQLAlchemy与python结合使用,并且我想更新等于此查询的表中的特定行: 我通过sql alchemy编写了此代码,但无法正常工作: 返回此错误: 我该怎么做? 问题答案: 通常,您不使用,而是设置属性:

  • 问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连

  • 问题内容: 我在Java J2EE Web应用程序中使用Hibernate 3.5.2和Spring Core 3.0.1。当单独的用户同时更新同一记录时,我得到了StaleObjectStateExcpetion。事务由javax.persistence.EntityManager管理。这是我创建问题的步骤。 User1登录到应用程序 User2登录到应用程序 用户1开始编辑记录A 用户2开始编

  • 问题内容: 当前,我们在数据层中使用JDBC,并计划用hibernate代替它。我是Hibernate的新手,不确定Hibernate如何处理并发。如果我们使用spring进行事务管理,有人可以解释一下我如何处理并发更新:通过hibernate(在内存中进行hibernate的自动版本管理),或者我必须将version列放入数据库中以手动处理并发更新。 问题答案: 无论你是否使用Spring进行事