微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL表的原子更新

如何解决PostgreSQL表的原子更新

背景

我有一个简单的函数可以更新我的表。每当我执行脚本foo_script.py时,我都会调用函数set_status创建时间戳。完成该过程后,我将调用函数remove_status以使表中的条目为NULL。

我还有一个名为db.py的包装器脚本,该脚本可让我执行sql语句,因此在我的代码中我正在使用db.execute(),但这与我的问题无关。

想法是foo_script.py不能同时运行。

代码

def set_status() -> None:
    db.execute(
        ENVIRONMENT=db.get_environment(),sql="UPDATE my_table SET status_process = Now()",)

def remove_status() -> None:
    db.execute(
        ENVIRONMENT=db.get_environment(),sql="UPDATE my_table SET status_process = NULL",)

问题

不幸的是,脚本foo_script.py可能偶然运行2个或更多。我想避免任何比赛条件。我如何确保我进行的查询是原子性的。我是sql的新手,我不确定如何实现此目标。

解决方法

这听起来像是advisory locks的典型应用程序。

如果使用它们,则无需锁定数据库中的对象即可同步操作。此外,咨询锁可以独立于事务,因此您不必进行长时间的数据库事务以及所有相关的不愉快情况。

要获取锁,请运行

SELECT pg_advisory_lock (42);

并释放它,运行

SELECT pg_advisory_unlock(42);

42是锁号;您当然可以自由选择其他。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。