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

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

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

  1. LookupTable(models.Model):
  2. some_unique_id = models.CharField(max_length=256)
  3. status = models.CharField(choices=(('I', 'Initiated'), ('U', 'Updated')))
  4. @transaction.atomic
  5. def my_function(unique_id):
  6. # The following call is invoked only if status is 'Initiated'.
  7. lookup = LookupTable.objects.select_for_update.filter(some_unique_id=unique_id, status='I'). # only one record per unique_id
  8. if not lookup:
  9. return
  10. lookup.update(state='U')
  11. # My business logic which create/update some records in some other table
  12. ----------
  13. ----------

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

暂无答案!

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

相关问题