一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交,我们需要在保存订单中自己控制数据库事务的执行流程
调用@transaction.atomic,进行整体回滚
from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 #...
from django.db import transaction def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 #... with transaction.atomic(): # 这部分代码会在事务中执行 #...
注:装饰器和with语句直接使用会导致异常没有办法处理,如果需要处理异常,则可以通过以下的方式进行
from django.db import transaction def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 #... try: with transaction.atomic(): # 这部分代码会在事务中执行 #... except 异常: # 处理异常的代码
需要注意的是要和装饰器进行配合
from django.db import transaction @transaction.atomic def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 #... try: # 在事务开始前创建保存点 save_id = transaction.savepoint() # 这部分代码会在事务中执行 #... # 提交从保存点到当前状态的所有数据库事务操作 transaction.savepoint_commit(save_id) except 异常: # 回滚到保存点 transaction.savepoint_rollback(save_id) # 处理异常的代码