事务的四大特性(ACID)
如果想要说明一个数据库或者一个框架支持事务性操作,则必须要满足下面的四大特性:
-
原子性(Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚到事务开始前的状态。
-
一致性 (Consistency):事务开始之前和事务结束后,数据库的完整性约束没有被破坏。
-
隔离性(Isolation):隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰,多个并发事务之间,应当相互隔离。
-
持久性(Durability):事务执行成功后,该事务对数据库的更改是持久保存在数据库中的,不会被回滚。
注意:
并不是所有的数据库或框架支持事务操作。比如在MySQL中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
全局事务-不推荐
局部事务-推荐
1、视图函数
# 案例一:函数视图
from django.db import transaction
@transaction.atomic
def viewdemo(request):
# This code executes inside a transaction.
...
pass
2、视图类
# 案例二:基于类的视图
from django.db import transaction
from rest_framework.views import APIView
class OrderListView(APIView):
# 开启事务,当方法执行完以后,自动提交事务
@transaction.atomic
def post(self, request):
...
pass
3、上下文管理器with
from django.db import transaction
def viewdemo(request):
# 默认自动提交
...
# 显式地开启事务
with transaction.atomic():
# 下面这段代码在事务中执行
...
pass
4、Savepoint回滚(尽量避免savepoint)
from django.db import transaction
def viewdemo(request):
# 默认自动提交
...
# 显式地开启事务
with transaction.atomic():
# 下面这段代码在事务中执行
# 创建事务保存点
sid = transaction.savepoint()
try:
do_more_stuff()
except Exception as e:
# 如发生异常,回滚到指定地方。
transaction.savepoint_rollback(sid)
# 如果没有异常,显式地提交一次事务
transaction.savepoint_commit(sid)
return HttpResponse("Success")
官方建议:要避免在 atomic
内部捕捉异常!,没明白什么意思,网上查了下,有的说是【在原子块中不要进行错误捕获(执行return和raise)】,等待大佬讲解!!!