我需要在google appengin中使用事务吗

2024-05-15 08:54:11 发布

您现在位置:Python中文网/ 问答频道 /正文

更新0 我的def post()代码已经发生了巨大的变化,因为它最初是基于一个数字表单的,它包括复选框和文本输入字段,而不仅仅是文本输入字段,而当前的设计更像纸张。然而,结果我有其他的问题,这些问题可以通过一个建议的解决方案来解决,但是我不能完全遵循这个建议的解决方案,所以让我试着解释一下新的设计和问题。在

较小的问题是我的实现效率低下,因为在def post()中,我为每个输入时隙创建了一个不同的name,它是一个长字符串<courtname><timeslotstarthour><timeslotstartminute>。在我的代码中,这个name是在一个嵌套的for循环中读取的,代码片段如下[我认为效率非常低]。在

tempreservation=courtname+str(time[0])+str(time[1])
name = self.request.get('tempreservation',None)

更严重的直接问题是我的def post()代码从来没有被读取过,我也不知道为什么(也许以前也没读过,但我还没有测试过)。我想知道问题是不是现在我希望帖子和get都能以同样的方式“完成”。下面的第一行用于post(),第二行用于get()。在

^{pr2}$

我的新post()如下所示。请注意,我在代码中留下了logging.info,看看我是否能到达那里。在

^{3}$

最后,我希望通过比较数据存储中现有的保留数据与隐含的新保留,向上面的get()代码添加检查/验证,并弹出一个警报,通知用户她可以解决的任何潜在问题。在

我也希望你能对这两个问题发表意见。在

更新0结束

我的应用程序是为一个社区网球场。我想用一张模拟纸质表格的在线电子表格代替纸质表格。虽然看起来不太可能发生两次网球约会冲突的“事务性”冲突。那么,我该如何让第二位预约者提前了解冲突,同时也让成功的一方有机会像在纸上一样(用橡皮擦)改变她的约会呢。在

每半小时是表格上的一个时间段。人们通常在“提交”之前一次注册多个半小时。在

所以在循环中的代码中,我做了一个get-unall。如果任何get成功,我想让用户控制是否接受put()。我仍然认为put()将是一个全有或全无,而不是选择性的。在

所以我的问题是,我是否需要让部分代码使用显式的“事务”?在

class MainPageCourt(BaseHandler):

    def post(self, location_id):
        reservations = self.request.get_all('reservations')
        day = self.request.get('day')
        weekday = self.request.get('weekday')
        nowweekday = self.request.get('nowweekday')
        year = self.request.get('year')
        month = self.request.get('month')
        nowmonth = self.request.get('nowmonth')
        if not reservations:
            for r in reservations:
                r=r.split()
                iden = r[0]
                temp = iden+' '+r[1]+' '+r[2]
                court = db.Key.from_path('Locations',location_id,'Courts', iden)
                reservation = Reservations(parent=court) 
                reservation.starttime = [int(r[1]),int(r[2])]
                reservation.year = int(r[3])
                reservation.nowmonth = int(r[4])
                reservation.day = int(r[5])
                reservation.nowweekday = int(nowweekday)
                reservation.name = self.request.get(temp)
                reservation.put()
            return webapp2.redirect("/read/%s" % location_id)
        else:
            ... this important code is not written, pending ...
            return webapp2.redirect("/adjust/%s" % location_id)

Tags: 代码nameselfidgetputrequestdef
3条回答

我认为您应该始终使用事务处理,但我不认为事务可以最好地解决您的问题。在

我认为你应该实行一个两阶段的预订系统,这是你在大多数购物袋和票务公司看到的。在

  1. 发布表单会创建一个“预订请求”,它将“在别人的购物袋中”的时间隔离开5-15分钟
  2. 用户必须在批准屏幕上再次提交以确认时间。你也可以让他们更新屏幕上的冲突,并尽可能长时间地重置时间段上的“保留锁定”。在
  3. cronjob(或者由在某个窗口传入的请求触发的伪作业)清除过期的保留锁,并将时间返回到可用插槽池中。在

您可以检查给定的Court中的时隙的可用性,并只在它们的stat_time不冲突的情况下写入相应的Reservations子实体。在

下面是如何使用祖先查询对1个预订执行此操作:

@ndb.transactional
def make_reservation(court_id, start_time):
  court = Court(id=court_id)
  existing = Reservation.query(Reservation.start_time == start_time,
                               ancestor=court.key).fetch(2, keys_only=True)
  if len(existing):
    return False, existing[0]
  return True, Reservation(start_time=start_time, parent=court.key).put()

或者,如果将slot部分作为保留id,则可以删除查询并构造保留实体键以检查它们是否已经存在:

^{pr2}$

相关问题 更多 >