Django 的 竟态条件 (race condition) 和 信号 (signal)的综合处理问题

背景

现有的项目需要拥有一个时间颗粒度的交易数据,同时也会基于此交易表生成一个以天为时间颗粒度的交易表和一个以周为颗粒度的交易表。

所以,这就涉及到了一个数据更新过程中的一个数表联动问题,即更新了最基础的时间颗粒度的交易数据表之后,需要发信号给天颗粒度和周颗粒度的交易表,通知他们进行更新。

在整个操作过程中,发现 竟态条件 场景出现,即多个线程同时给天颗粒度和周颗粒度的交易表发信号,造成 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)

3. 检查最后的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值