• 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("订单生成失败!")
  • 相关阅读:
    .net core web api swagger 配置笔记
    mvc下ajax请求遇到session超时简单处理方式
    sql ltrim/rtrim 字段中为中文时出现?的问题
    SQL 将一个字段内用逗号分隔的内容分成多条记录
    bootstrap下modal模态框中webuploader控件按钮异常(无法点击)问题解决办法【转】
    mvc 封装控件使用mvcpager
    uploadify在chrome下初始化失败,在Firefox下却可以原因探析
    MVC FormCollection 无法获取值的问题
    linq to sql之like
    mvcpager 表单提交时无法获取pageindex的值
  • 原文地址:https://www.cnblogs.com/jalen-123/p/13192078.html
Copyright © 2020-2023  润新知