Django - 特定时间后的transaction.atomic回滚

时间:2018-03-01 06:26:22

标签: django transactions 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

1 个答案:

答案 0 :(得分:0)

您需要的是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你阻止这个房间五分钟。

由于您正在做两件需要合作的事情,因此您需要将它们包装在一个交易中。