L-Jason

do sth you need, then do sth you want 。。。

django中基于ORM框架的事务处理

django中基于orm的事务处理

  今天在一段配置mysql数据库的代码中看到了一个陌生的字段: 'ATOMIC_REQUESTS': True,  然后就去网上搜了一下, 才知道它的作用是是用来实现在django中mysql数据库的事务特性。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db123',
        'HOST': '127.0.0.1',
        'POST': '3306',
        'USER': 'root',
        'PASSWORD': '123456',
        'ATOMIC_REQUESTS': True
    }
}
数据库配置

  了解mysql数据库的都知道mysql数据库支持事务操作, 其用的最多的就是原子性,即一组操作要么同时成功,要么就全部失败回滚。

## 04 事务的四大特性

1. 原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
2. 一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
3. 隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
4. 持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务四大特性

  查看了部分资料后我发现在django中有多种方式可以实现mysql事务特性

 

 

第一种是将http requests的数据库操作集成到一个transcation中 , 这种实现方式如上(数据库配置) , 在数据库配置中插入'ATOMIC_REQUESTS': True属性

   这种方式存在一个缺陷 , 即他是全局事务 , 即执行每一个视图函数都会开始一个事务 , 仅当该视图正常执行结束后才会提交这个事务, 这样虽然在很大程度上提高了数据的安全性, 但是对网站效率的影响是巨大的 , 尤其是在网站访问量大的时候。

 

   

第二种是通过中间件实现transcation

  配置方法如图, 配置settings.py中的中间件

  1. 中间件配置

     注意 :配置中间件时需要注意中间件的放置位置 (中间件的执行顺序request从上到下, response从下至上)

    所以在该中间件以下的中间件都会受到事务控制,  但CacheMiddleware,UpdateCacheMiddleware,FetchFromCacheMiddleware 这些中间件不会受到影响,因为cache机制有自己的处理方式,用了内部的connection来处理。另外TransactionMiddleware 只对默认的数据库配置有效,如果要对另外的数据连接用这种方式,必须自己实现中间件。

 

 

第三种是通过装饰器来实现事务操作

  这是一种灵活的操作视图事务的方式 , 推荐使用 , 可以根据数据的重要性和关联性进行事务操作 , 按需分配实现安全和效率的最大化

    

    1)@transaction.autocommit

      

    django默认的事务处理,采用此装饰模式这种方式可以忽视全局的transaction配置。

    2)@transaction.commit_on_success

    

    采用此装饰模式,当此方法的所有工作完成后,才会提交事务。

    3)@transaction.commit_manually

    

    采用这种方式,你可以自由地随意提交或回滚事务,完全自己处理。如果没有调用commit()或rollback(),则程序会抛出TransactionManagementError异常。

 

 

学习过程参考 : https://www.cnblogs.com/znicy/p/5434829.html

 

posted @ 2019-04-09 00:42  L-Jason  阅读(887)  评论(0)    收藏  举报