Python 防止多个请求可能同时触发只应运行一次的调用的争用情况
因此,这不一定是Django的问题,我只是有一个思维障碍让我的头脑绕过逻辑,但我想Django可能会提供一些手动锁定记录的方法,这会很有帮助 基本上,用户一次可以上载一个或多个文件。每个文件都通过单独的请求上传。当用户超过90%的存储配额时,我想向他们发送一封电子邮件通知他们,但我只想发送一封电子邮件。因此,我当前的工作流程是检查它们的使用情况,确保它们尚未发送提醒,以及:Python 防止多个请求可能同时触发只应运行一次的调用的争用情况,python,django,django-models,django-1.4,Python,Django,Django Models,Django 1.4,因此,这不一定是Django的问题,我只是有一个思维障碍让我的头脑绕过逻辑,但我想Django可能会提供一些手动锁定记录的方法,这会很有帮助 基本上,用户一次可以上载一个或多个文件。每个文件都通过单独的请求上传。当用户超过90%的存储配额时,我想向他们发送一封电子邮件通知他们,但我只想发送一封电子邮件。因此,我当前的工作流程是检查它们的使用情况,确保它们尚未发送提醒,以及: if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and di
if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and disk.last_high_usage_reminder is None:
disk.last_high_usage_reminder = timezone.now()
disk.save()
vdisks_high_usage_send_notice(user)
但是,上面的代码通常允许多封电子邮件通过。因此,我的第一个想法是在检查值之前以某种方式锁定磁盘记录,然后在保存后解锁它。这是可能的和/或可取的,还是有更好的方法?好的,我相信我已经用这个答案解决了这个问题: 首先,实现这个实用功能:
@transaction.commit_manually
def flush_transaction():
transaction.commit()
然后修改我的原始代码以刷新并重新加载磁盘记录:
flush_transaction()
disk = user.profile.diskstorage
if usage_pct >= settings.VDISK_HIGH_USAGE_THRESHOLD and disk.last_high_usage_reminder is None:
disk.last_high_usage_reminder = timezone.now()
disk.save()
vdisks_high_usage_send_notice(user)