如何解决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 举报,一经查实,本站将立刻删除。