确保查询是原子的

问题描述

背景

在下面的代码中,我有一个名为process的函数,该函数会执行一些操作,并且在运行时,我想确保它不会同时运行。我有一个名为creation_status的表,可以在我开始该过程时在其中设置时间戳。我使用时间戳的原因是,它可以让我知道何时需要启动此过程。

我总是检查是否已经有时间戳记,是否存在异常,以确保我没有同时运行此脚本。

代码

def is_in_process() -> bool:
    status = db.run_query(sql="SELECT is_in_process FROM creation_status")
    return False if status[0].is_in_process is None else True


def set_status() -> None:
    db.execute(sql="UPDATE creation_status SET is_in_process = NOW()")

def delete_status() -> None:
    db.execute(sql="UPDATE creation_status SET is_in_process = NULL")


def process():
 if is_in_process():
        raise Exception("Must not run concurrent process creations." )
    set_status()
    # stuff happens
    delete_status()

问题

我想确保我的查询是 atomic ,以消除比赛条件。在我检查函数is_in_process并调用函数set_status时,可能会启动另一个脚本。我如何确保这两件事一口气发生,所以我避免了比赛条件。

请让我知道我是否可以解释清楚一些,并且我愿意接受所有建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)