事务被广泛运用于订单系统,银行系统。先说一下事务是什么?
事务
事务是一组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)