python—通过查找没有竞争条件的表列值来避免调用业务逻辑

4ktjp1zp  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(142)

通过查看数据库表列值,可以有效地阻止函数调用。我有一个模型(lookuptable),如下所示,
在我的应用程序(django+postgres)中,有可能通过两种方式调用“my_函数”:1.在特定事件发生后由第三方调用(通过api调用);2.由我自己的作业调用(在特定事件发生后的某个固定时间后调用)
我想确保第三方或我自己的工作调用“我的函数”以获得“唯一的\u id”。我的计划是查看“lookuptable”状态列,并确定是否继续执行“my_函数”。一旦任何进程调用该函数,就将状态从“i”标记为“u”。
我使用以下策略来确保两个过程是否同时开始工作

LookupTable(models.Model):
    some_unique_id = models.CharField(max_length=256)
    status = models.CharField(choices=(('I', 'Initiated'), ('U', 'Updated')))

@transaction.atomic
def my_function(unique_id):

    # The following call is invoked only if status  is 'Initiated'.
    lookup = LookupTable.objects.select_for_update.filter(some_unique_id=unique_id, status='I'). # only one record per unique_id
    if not lookup:
        return
    lookup.update(state='U')
    # My business logic which create/update some records in some other table
    ----------
    ----------

我使用了“select_for_update”和transaction来阻止其他db事务以获取记录上的锁。我的方法是否能完美工作(线程安全),可能存在哪些问题(如有)。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题