运行环境:
Python3.6+Django3.2+MySQL5.7
Django默认的事务行为
django默认的事务行为是自动提交。自动使用事务或还原点,以确保多次查询的ORM操作的一致性。
使用
1.在models.py建立一个模型供测试使用
from django.db import models class User(models.Model): name = models.Charfield(null=False,max_length=64) age = models.Integerfield(null=True) class Meta: db_table = 'user'
3.使用示例一、全局控制,
3.1.由于django默认自动提交事务,所以在setting.py文件设置数据库连接的时候需要将AUTOCOMMIT设为False:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'gyl', 'USER': 'root', 'PASSWORD': 'root123', 'HOST': '127.0.0.1', 'PORT': 3306, 'ATOMIC_REQUESTS': True }, }
3.2 视图示例
from django.db import transaction from app01 import models def test(): with transaction.atomic():#在使用多个数据库连接时,需要传入对数using='数据库连接名' sid = transaction.savepoint()#创建保存点,在使用多个数据库连接时,需要传入对数using='数据库连接名' try: models,.User.objects.create( name='张三',age = 18 ) s = models.User.objects.filter(hobby='basketball')#由于User模型并没有hobby字段,所有这行代码会报异常 transaction.savepoint_commit(sid) except: transaction.savepoint_rollback(sid)#回滚到保存点,在使用多个数据库连接时,需要传入对数using='数据库连接名'
4.使用示例,使用装饰器控制
1此方法针对单个视图,不涉及全局设置,所以不用在setting.py里面对ATOMIC_REQUESTS参数进行设置
from django.db import transaction from app01 import models @transaction.atomic() def test(): models,.User.objects.create( name='张三',age = 18 ) s = models.User.objects.filter(hobby='basketball')#由于User模型并没有hobby字段,所有这行代码会报异常 transaction.commit()
注:使用装饰器进行控制时,视图内部对ORM的操作不能进行异常处理,否则无法进行事务控制!!!