当前事务中发生错误在“原子”块结束之前,不能执行查询

xytpbqjk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(379)

已经阅读了多种解决方案的来源,如guaravs post(包括评论中的所有建议)和alexander等,但仍然无法解决问题。创建数据库条目@models.orderitemtax.objects.create()时出错
使用django 1.11.3和mysql 14.14
views.py**由于函数长度超过600行,因此只包含部分代码。

def checkout_cart(request):
     try:
        item_to_group_keys = []
        promo_key = 'promo:' + str(request.user.id)

        with connection.cursor() as cursor:
            with transaction.atomic():
                // more code here...
                try:
                    with transaction.atomic(): // updated solution
                        event = ''
                        group = models.Group.objects.get(id=order_item.group.id)
                        now = timezone.now()
                        event_date = now.strftime('%Y-%m-%d')

                        try:
                            event = models.Event.objects.get(group_id=group.id, date=event_date)
                            try:
                                self_attendee = models.EventAttendee.objects.get(event=event,
                                                                                    user_id=request.user.id,
                                                                                    is_attending=True)
                            except:
                                self_attendee = models.EventAttendee.objects.create(event=event,
                                                                                    user_id=request.user.id,
                                                                                    is_attending=True)
                                self_attendee.save()
                        except models.Event.DoesNotExist:
                            event = models.Event.objects.create(group_id=group.id, date=event_date, planner_id=request.user.id)
                            todays_site_deal = models.SiteDeal.objects.get_deal()
                            if todays_site_deal is not None and todays_site_deal != '':
                                event.site_deal = todays_site_deal
                            event.save()

                            self_attendee = models.EventAttendee.objects.create(event=event, user_id=request.user.id, is_attending=True)
                            self_attendee.save()

                            initial_group_members = models.GroupMembership.objects.filter(group_id=group.id, status_id=1)
                            group_members = initial_group_members.exclude(user_id=request.user.id)

                            for gm in group_members:
                                userprofile = models.UserProfile.objects.get(user_id=gm.user_id)
                                attendee_request = models.EventAttendeeRequest.objects.create(event=event, user_id=gm.user_id)
                                attendee_request.status = models.EventRequestStatusOpt.objects.get(id=3)
                                attendee_request.save()
                                group_fn = gm.user.first_name
                                group_ln = gm.user.last_name
                                group_pn = userprofile.phone

                                if group_fn != '' and group_ln != '' and group_pn != '' and group_pn is not None:

                                    non_digits = re.compile(r'[^\d]+')
                                    group_pn = non_digits.sub('', group_pn)

                                    # request_hash = str(member_request.pk) + str(group_id) + str(int(round(time.time())))
                                    # request_hash = int(request_hash) ^ 0xABCEEFAB
                                    # member_request.hash = request_hash

                                    text_message = event.planner.first_name + " from your Cliiique " + event.group.name + " started shopping. Join today's event!"
                                    try:
                                        pn_check = client_lookup.phone_numbers.get(group_pn)

                                        if pn_check.phone_number is not None:  # if invalid, throws an exception
                                            # SMS
                                            # -------------------------------------------------
                                            message = client_rest.messages.create(
                                                body=text_message,
                                                to=group_pn,
                                                from_="+12132050074")
                                            # -------------------------------------------------

                                    except TwilioRestException as e:
                                        pass

                except: #group not in checkout, do not create event
                    pass

                # Get tax amount for each Item
                rate = Decimal('0.0950')
                oi_price = Decimal(order_item.op_price.strip(''))
                tax_amount = oi_price * rate
                oi_tax = models.OrderItemTax.objects.create(amount=tax_amount,
                                                            rate=rate,
                                                            order_item_id=order_item.pk)
                oi_tax.save()
     except IntegrityError:
        return HttpResponse("<strong>CODE #700: Fatal Transaction Error! Please contact customer service.</strong>")
cl25kdpy

cl25kdpy1#

来自文档:
避免捕捉原子内部的异常!
因为函数有多个嵌套的try和exceptions,所以我插入了另一个 transaction.atomic() 在测试中,除了最接近错误发生的地方。
根据文档,有嵌套的try和exceptions可能会使初始原子结构复杂化。我发现放置原子(第二次)有帮助。希望这能帮助其他面临类似情况的人。

try:
    item_to_group_keys = []
    promo_key = 'promo:' + str(request.user.id)

    with connection.cursor() as cursor:
        with transaction.atomic():
            // more code here...
            try:
                with transaction.atomic(): //**added second atomic**
                   //more code
            except:
                pass
 except IntegrityError:

相关问题