通过查看数据库表列值,可以有效地阻止函数调用。我有一个模型(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事务以获取记录上的锁。我的方法是否能完美工作(线程安全),可能存在哪些问题(如有)。
暂无答案!
目前还没有任何答案,快来回答吧!