Django - 特定时间后的transaction.atomic回滚
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django - 特定时间后的transaction.atomic回滚相关的知识,希望对你有一定的参考价值。
我正在尝试使用django创建一个预订应用程序。
在我的申请中,用户可以选择一个座位并在5分钟内付款。
当用户选择座位时,状态将更改为已阻止。
如果未在5分钟内完成付款,则所选座位状态应更改为可用。
我不知道如何使用transaction.atomic()
实现它。
通常可以实现rollback
例外,但在这里我该如何实现。
with transaction.atomic():
seat = Room.objects.get(account_id=location.id, seat_no=seat_no)
seat.state = blocked
seat.save()
如果未在5分钟内完成付款,如何将状态恢复为available
?
答案
你需要的是一个blocked_until
字段,即:
class Room(models.Moddel):
...
blocked_until = models.DateTimeField(default=datetime.datetime(1970,1,1))
默认值是“时间 - 时间”值,即小于任何敏感值。
然后您的保留视图将执行:
def reserve(request, roomnumber, seatno):
now = datetime.datetime.now()
now5 = now + datetime.timedelta(minutes=5)
with transaction.atomic():
room = Room.objects.get_object_or_404(
pk=roomnumber, seat=seatno,
blocked_until__lt=now # <== 1
)
room.blocked_until = now5 # <== 2
room.save()
在1
,您将选择房间/座位,但前提是它没有被阻止,即block_until字段值是过去的。
在2
你阻止这个房间五分钟。
由于您正在做两件需要一起完成的事情,因此您需要将它们包装在事务中。
以上是关于Django - 特定时间后的transaction.atomic回滚的主要内容,如果未能解决你的问题,请参考以下文章