我听说过这些与并发编程有关的词,但它们之间的区别是什么?
我有一个表,jobs
与领域id
,rank
和日期时间started
在一个MySQL的InnoDB数据库。
每次流程获得一项工作时,它都会“签出”该工作以将其标记为已开始,以便其他任何流程都无法对其进行处理。
我希望具有会话的单个进程能够:
而不会冒任何其他会话也可以选择并开始排名最高的工作的风险。其他会议也随时改变排名。
这是我的尝试:
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")
Run Code Online (Sandbox Code Playgroud)
但这失败了:
OperationalError: (OperationalError) (1099, "Table 'jobs' was locked with a READ lock and can't be updated")
Run Code Online (Sandbox Code Playgroud)
无论如何,我宁愿以SQLAlchemy提供的更加Python化的方式进行操作。我怎样才能做到这一点?
编辑:澄清一下,我说的是数据库中的读/写并发,而不是线程/进程同步。我的工作人员将遍布网络。