Django事务的使用

运行环境:

  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': False
    },
}
复制代码

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的操作不能进行异常处理,否则无法进行事务控制!!!


原创文章,转载请注明出处:http://124.221.219.47/article/8796541320/