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

 

  

上一篇:android – Zxing 2.2在eclipse中导入为一个库项目(而不是.jar)


下一篇:如何在JTextField上修复keylistener?