我想在PostgreSQL中实现一个互斥系统,其中多个工作进程在处理表(队列)时会暂时锁定表(队列)中的资源(行)。如果工作进程崩溃,我希望干净地释放锁,而不必依赖另一个进程来清理泄漏的锁。
到目前为止,我想出的是在事务中使用SELECT ... FOR UPDATE SKIP LOCKED
查询,该查询将锁定它找到的行,并跳过任何其他锁定的行。
它运作良好,但问题之一是工作人员可能需要一段时间才能完成任务,因此我需要在整个任务期间保持交易公开。
另一个问题是,工作程序需要增量工作,并将其状态持久保存到数据库中,这样,如果工作程序被停止或崩溃,它们便可以快速恢复到原来的状态。被锁定的行无法将它们的状态持久保存在同一表中(尽管我认为可以通过使用另一个表来持久保存状态来摆脱这种情况)。
我已经在Web上搜索了如何在SQL / PostgreSQL中实现信号灯或资源借用系统,但没有找到适合我的需求的东西。有没有使用PostgreSQL实现此目的的简单方法?