背景
现有的项目需要拥有一个时间颗粒度的交易数据,同时也会基于此交易表生成一个以天为时间颗粒度的交易表和一个以周为颗粒度的交易表。
所以,这就涉及到了一个数据更新过程中的一个数表联动问题,即更新了最基础的时间颗粒度的交易数据表之后,需要发信号给天颗粒度和周颗粒度的交易表,通知他们进行更新。
在整个操作过程中,发现 竟态条件 场景出现,即多个线程同时给天颗粒度和周颗粒度的交易表发信号,造成 get_or_create 操作产生多个重复数据。
查询了相关的资料之后,尝试了网络上的很多办法,发现了以下解决方案
1. 在 post_save 的修饰符下面,再添加一个修饰符
from django.db import transaction
@receiver(post_save, sender=时间颗粒度的交易数据表)
@transaction.atomic
2. 在 post_save 的函数过程中,使用具有原子性的 get_or_create
dict_query_day = {
'tran_date' : tran_date,
'product' : product,
'store' : store
}
record_day, created = TransactionDay.objects.get_or_create(**dict_query_day)