订单产生中的mysql事务

事务被广泛运用于订单系统,银行系统。先说一下事务是什么?

事务

事务是一组sql操作,要么都成功要么都失败。

事务的特性

原子性:事务包含的所有操作要么全部成功要么全部失败回滚,成功必须完全应用到数据库,失败则不能对数据库产生影响。

一致性:事务执行前和执行后必须处于一致状态。

隔离性:当多用户访问数据库的时候,数据库为每一个用户开启一个事务,这个事务不被其他事务操作干扰,多个并发事务直接互  相隔离。

持久性:一旦事务被提交了那么数据库中的数据改变是永久性的,即便数据库系统发生故障,也不会丢失事务操作。

事务的回滚

事务是用户定义的一组数据库操作,这些操作要么全做要么全不做,回滚会自动将该事务完成的操作撤销。

事务控制语句

BEGIN;/START TRANSACTION;
#显示的开启一个事务
COMMIT; /COMMIT WORK;
#二者等价,COMMIT会提交事务,并使已对数据库进行的修改是永久性的。
ROOLBACK; /ROOLBACK WORK; 
#二者等价,回滚结束用户的事务,并撤销正在运行的所有未提交的修改。
SAVEPOINT identifier;
SAVE POINT允许在事务中创建一个保存点,一个事务中可以有很多个SAVEPOINT
ROLLBACK to identfier;
#回滚到保存点
RELEASE SAVEPOINT identifier;
#删除一个事务的保存点,当没有指定保存点的时,执行该语句会抛出一个异常

在django中使用事务

django中的事务使用可以参考django官方文档:https://docs.djangoproject.com/zh-hans/2.0/

from django.db import transaction

@transaction.atomic
def viewfunc(request):
    # This code executes inside a transaction.
    do_stuff()

导入transaction后用transaction.atomic进行装饰,就会把所装饰函数中的涉及数据库中的操作放入到事务中,

这里,数据库的操作可分为两段,在进行事务回滚时候,在进行事务回滚的时候没有必要全部进行回滚,这样就可以在某个位置设置一个上面提到的保存点:

#设置事务的保存点
save_id=transaction.savepoint()

举例当查询数据不存在的时候:

good=Goods.objects.get(id=id)
except:
#若商品不存在
transaction.savepoint_rollback(save_id)
return JsonResponse({'res':4,'errmsg':'商品不存在'})

以上举例为查询商品不存在,同理若判断商品的库存不足,则同样需要事务进行回滚。

在django项目中,但凡涉及到数据库操作的可以使用try-exception进行异常捕获,如果有异常就进行事务回滚,并给出提示信息。若没有问题则事务提交。

#提交事务
transaction.savepoint_commit(save_id)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值