Django中MySQL事务的使用

Django中事物的使用

from django.db import transaction

@transaction.atomic
通过transaction的@transaction.atomic装饰器来开启事务,在视图逻辑涉及数据库操作的地方添加事物保存点,在操作不满足时进行事物回滚,在操作满足是进行事物提交

# 前端传递的参数:地址id(addr_id) 支付方式(pay_method) 用户要购买的商品id字符串(sku_ids)
# mysql事务: 一组sql操作,要么都成功,要么都失败
# 高并发:秒杀
# 支付宝支付
class OrderCommitView(View):
‘‘‘订单创建‘‘‘
@transaction.atomic
def post(self, request):
‘‘‘订单创建‘‘‘
# 判断用户是否登录
user = request.user
if not user.is_authenticated():
# 用户未登录
return JsonResponse({‘res‘: 0, ‘errmsg‘: ‘用户未登录‘})

# 接收参数
addr_id = request.POST.get(‘addr_id‘)
pay_method = request.POST.get(‘pay_method‘)
sku_ids = request.POST.get(‘sku_ids‘)

# 校验参数
if not all([addr_id, pay_method, sku_ids]):
return JsonResponse({‘res‘: 1, ‘errmsg‘: ‘参数不完整‘})

# 校验支付方式
if pay_method not in OrderInfo.PAY_METHODS.keys():
return JsonResponse({‘res‘: 2, ‘errmsg‘: ‘不支持的支付方式‘})

# 校验地址
try:
addr = Address.objects.get(id=addr_id)
except Address.DoesNotExist:
# 地址不存在
return JsonResponse({‘res‘: 3, ‘errmsg‘: ‘地址非法‘})

# todo:创建订单核心业务

#组织参数
#订单id:20190416222615+用户id
order_id = datetime.now().strftime(‘%Y%m%d%H%M%S‘)+str(user.id)

# 运费
transit_price = 10

# 总数目和总金额
total_count = 0
total_price = 0

# 设置事务保存点
save_id = transaction.savepoint()
try:
# todo: 向df_order_info表中添加一条记录
order = OrderInfo.objects.create(order_id=order_id,
user=user,
addr=addr,
pay_method=pay_method,
total_count=total_count,
total_price=total_price,
transit_price=transit_price)

# todo: 用户的订单中有几个商品,需要向df_order_goods表中加入几条记录
conn = get_redis_connection(‘default‘)
cart_key = ‘cart_%d‘ % user.id

sku_ids = sku_ids.split(‘,‘)
for sku_id in sku_ids:
# 获取商品的信息
try:
sku = GoodsSKU.objects.get(id=sku_id)
except:
# 商品不存在,进行事物回滚
transaction.savepoint_rollback(save_id)
return JsonResponse({‘res‘: 4, ‘errmsg‘: ‘商品不存在‘})

# 从redis中获取用户所要购买的商品数量
count = conn.hget(cart_key, sku_id)

# todo: 判断商品的库存
if int(count) > sku.stock:
# 库存不足,进行事物回滚
transaction.savepoint_rollback(save_id)
return JsonResponse({‘res‘: 6, ‘errmsg‘: ‘商品库存不足‘})

# todo: 向df_order_goods表中添加一条记录
OrderGoods.objects.create(order=order,
sku=sku,
count=count,
price=sku.price)
# todo: 更新商品的库存和销量
sku.stock -= int(count)
sku.sales += int(count)
sku.save()

# todo: 累加计算订单商品的总数量和总价格
amount = sku.price*int(count)
total_count += int(count)
total_price += amount

# todo: 更新订单信息表中的商品的总数量和总价格
order.total_count = total_count
order.total_price = total_price
order.save()
except Exception as e:
transaction.savepoint_rollback(save_id)
return JsonResponse({‘res‘: 7, ‘errmsg‘: ‘下单失败‘})

# 提交事务
transaction.savepoint_commit(save_id)

# todo: 清除用户购物车中对应的记录
conn.hdel(cart_key, *sku_ids)

# 返回应答
return JsonResponse({‘res‘: 5, ‘message‘: ‘创建成功‘})

  

原文地址:https://www.cnblogs.com/LiuXinyu12378/p/11333543.html

时间: 2024-10-25 14:49:26

Django中MySQL事务的使用的相关文章

django中数据库事务的处理

今天在django中处理数据库数据时,用到事务,官方文档看不下去,网上查资料,那叫一个大海捞针啊,还找不到自己想要的效果. django中的事务, 依据Django1.6的文档,“Django提供了一种简单的API去控制数据库的事务交易...原子操作用来定义数据库事务的属性. 原子操作允许我们在数据库保证的前提下,创建一堆代码.如果这些代码被成功的执行,所对应的改变也会提交到数据库中.如果有异常发生,那么操作就会回滚.”可以采用装饰器用法或代码块用法,强力推荐代码块,如下. from djang

Django中MySQL读写分离技术

最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类型的数据库),我们需要做的就是,定义不同的数据库,定义不同的路由规则. 首先定义我们的主从数据库: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': sae.const.MYSQL_DB, 'USER':

django中的事务管理

在讲解之前首先来了解一下数据库中的事务. 什么是数据库中的事务? 热心网友回答: (1):事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. (2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束. COMMIT表示提交,即提交事务的所有操作.具体地说就是将事务中所有对数据库的更新写回

Django中mysql配置设置

settings文件中设置:你的数据库名称在设置之前先确保已经创建了这个数据库 DATABASES = { 'default':{ 'ENGINE':'django.db.backends.mysql', 'NAME':'books', #数据库名称 'USER':'root', #数据库用户名 'PASSWORD':'123456', # 数据库密码 'HOST':'', #数据库主机,留空默认为localhost 'PORT':'3306', #数据库端口 } } 之前 DATABASES设

python-django中使用事务以及小坑

django中使用事务 一.导入事务模块 from django.db import transaction 二.对相应的业务进行事务操作 方式一:为整个函数进行事务操作 @transaction.atomic def mysql_test(): '''该函数进行一些关于数据库的操作''' pass 方式二:为部分代码进行事务操作 # 视图函数 def mysql_test(request): try: with transaction.atomic(): # 一系列对数据库的操作 pass e

django中怎么使用mysql数据库的事务

Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交.我们需要在保存数据库操作中自己控制数据库事务的执行流程. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法: 装饰器用法 from django.db import transaction

Django 中事务的使用

在 Django 中可以通过django.db.transaction 模块提供的atomic来定义一个事务 atomic提供两种方案实现事务 装饰器用法: from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 ...... 装饰器用法:整个视图中所有 MySQL 数据库的操作都看做一个事务,范围太大,不够灵活.而且无法直接作用于类视图 with 语句用法: fro

MAC中Django中runserver提示Can't connect to local MySQL server through socket '/tmp/mysql.sock错误

好像不止遇到一次,直接Google就可以了,在stackoverflow中就有答案,答案就是你没有开MySQL - -. stackoverflow链接见 http://stackoverflow.com/questions/16325607/cant-connect-to-local-mysql-server-through-socket-tmp-mysql-sock 开启MySQL的命令如下: mysql.server start MAC中Django中runserver提示Can't co

漫谈MySql中的事务

最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的运用于订单系统.银行系统等多种场景.如果有以下一个场景:A用户和B用户是银行的储户.现在A要给B转账500元.那么需要做以下几件事: 1. 检查A的账户余额>500元: 2. A账户扣除500元: 3. B账户增加500元: 正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜.那如果A账