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

问题描述 投票:2回答:1

我正在尝试使用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

django transactions atomic
1个回答
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你阻止这个房间五分钟。

由于您正在做两件需要一起完成的事情,因此您需要将它们包装在事务中。

© www.soinside.com 2019 - 2024. All rights reserved.