python項目_mysql開啟事務


1.導入模塊包

from django.db import transaction

2.設置回滾點

        with transaction.atomic():
            save_id = transaction.savepoint() # 設置回滾點
            try:
                order = Order.objects.create(
                    order_title=order_title,
                    total_price=total_price,
                    real_price=real_price,
                    order_number=order_number,
                    order_status = 0,
                    pay_type=pay_type,
                    credit=credit,
                    coupon=coupon,
                    user_id=user_id
                )

                # 記錄當前訂單定義的課程信息到訂單詳情
                redis_conn = get_redis_connection("cart")
                cart_hash = redis_conn.hgetall("cart_%s" % user_id)
                selected_set = redis_conn.smembers("selected_%s" % user_id)

                # 開啟redis事務
                pipe = redis_conn.pipeline()
                pipe.multi()

                # 計算取當前課程的總價格價格
                total_price = 0
                coupon_price = 0

                for course_id_bytes in selected_set:
                    course_id = course_id_bytes.decode()
                    expire_time = int( cart_hash.get(course_id_bytes).decode() )

                    # 根據當前課程ID來獲取課程信息
                    course = Course.objects.get(pk=course_id)

                    # 把課程信息添加到訂單詳情里面
                    order_detail = OrderDetail.objects.create(
                        order=order,
                        course=course,
                        expire=expire_time,
                        price=course.real_price(expire_time),
                        real_price=course.real_price(expire_time), # todo 將來完成優惠券或者積分的時候計算真實的價格
                        discount_name="原價購買", # todo 將來完成了優惠以后,這里進行調整
                    )

                    # 從購物車中刪除對應的商品課程
                    pipe.hdel("cart_%s" % user_id, course_id)
                    pipe.srem("selected_%s" % user_id, course_id)

                    total_price += float(order_detail.price)

                # 計算訂單的總價格
                # 判斷是否使用了積分,,如果使用了積分,則積分抵扣的金額
                if credit > 0:
                    # 判斷是否使用了優惠券,如果使用了優惠券,則計算優惠券的抵扣金額
                    credit_price = credit / constants.CREDIT_MONEY

                if coupon > 0:
                    user = self.context["request"].user
                    coupon = validated_data.get("coupon")
                    now_time = datetime.now()
                    try:
                        result = UserCoupon.objects.get(pk=coupon, is_show=True, is_deleted=False, user_id=user.id, start_time__lt=now_time, end_time__gt=now_time)
                    except UserCoupon.DoesNotExist:
                        raise serializers.ValidationError("對不起,當前優惠券不存在或者已經過期不可用!")

                    sale = result.coupon.sale
                    if result.coupon.coupon_type == 0:
                        # 折扣優惠
                        coupon_price = total_price * (1-float(sale[1:]))
                    else:
                        # 減免優惠
                        coupon_price =  float(sale[1:] )

                # 提交redis事務操作
                pipe.execute()

                #保存總價格和實付價格到訂單里面
                order.total_price = total_price
                order.real_price = total_price - credit/constants.CREDIT_MONEY - coupon_price
                order.save()
            except:
                transaction.savepoint_rollback(save_id)
                return serializers.ValidationError("訂單生成失敗!")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM