概述
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=0for course_id_bytes inselected_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_MONEYif 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)exceptUserCoupon.DoesNotExist:raise serializers.ValidationError("对不起,当前优惠券不存在或者已经过期不可用!")
sale=result.coupon.saleif 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("订单生成失败!")
最后
以上就是糟糕舞蹈为你收集整理的python实现mysql事务_python项目_mysql开启事务的全部内容,希望文章能够帮你解决python实现mysql事务_python项目_mysql开启事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复