Peewee行级锁定

5
我目前在我的项目中使用Peewee作为ORM。在我的当前情况下,我有一些进程每个都有一个数据库连接。所有这些进程都需要同时访问某个表。我正在寻找一种方式使它们协调而不使用中央控制器。为此,当一个进程读取一行时,它必须被锁定,没有其他进程可以读取该行。被阻塞的进程应继续处理其他非阻塞行。
我搜索了一下,发现MySQL已经有了一个内部锁定机制,描述在这里,显然它必须用于索引列才能按预期工作(来自这里)。但是我在peewee文档中找不到任何相关信息。是否有提供这些功能的扩展?或者我应该编写包含FOR Update子句的原始SQL查询?
1个回答

8

Peewee支持使用FOR UPDATE语句,我想这可能是你想要的。它不会阻止其他客户端进行读取,但只要持有锁的事务处于打开状态,就可以防止修改。

例如:

with db.atomic():
    # lock note.
    note = Note.select().where(Note.id == 123).for_update().get()
    # As long as lock is held no other client can modify note.

3
它支持 NOWAITSKIP LOCKED 吗?我在文档中找不到任何信息。另一个问题,你说“使用 FOR UPDATE 不会阻止其他客户端读取”,那么我该如何防止这些读取?我知道 SELECT ... FOR SHARE 被阻塞了,但简单的 SELECT 查询没有被阻塞。 - Offofue
顺便问一下,如何在 db.atomic() 中指定事务的隔离级别? - Offofue
.for_update('for share nowait') -- 或者 .for_update('for update nowait') - 等等 - coleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接