Django|Django ORM 和 sqlalchemy 在每次发起数据库请求前对事务的清理操作
Django 会在每次请求之前先执行
- SET AUTOCOMMIT = 0
- SET AUTOCOMMIT = 1
- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
上面的三步操作可以认为是预备操作(但是在 Django 的 ORM 日志中不会记录)。
你可能会疑惑,为什么要先
SET AUTOCOMMIT = 0
再 SET AUTOCOMMIT = 1
呢?这个问题换一个问法就是:Django 如何保证事务干净?其实原因很简单,就是为了
连接复用
的时候清理掉上次事务残留。Mysql 的事务中有一个
隐式提交
提交的概念当我们在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上一个事务,比如这样:当然,这个操作是为了
BEGIN; SELECT ... # 事务中的一条语句 UPDATE ... # 事务中的一条语句 ... # 事务中的其它语句BEGIN; # 此语句会隐式的提交前边语句所属于的事务
或者当前的autocommit系统变量的值为OFF,我们手动把它调为ON时,也会隐式的提交前边语句所属的事务。
或者使用LOCK TABLES、UNLOCK TABLES等关于锁定的语句也会隐式的提交前边语句所属的事务。
连接复用
而存在的,但是 Django ORM 默认的行为是不需要连接复用的,因为默认是为每个 Request 单独新建一个连接。2021-11-28T04:47:39.604596Z307 Connectroot@192.168.31.100 on d_twitter_db using TCP/IP
2021-11-28T04:47:39.608104Z307 QuerySET AUTOCOMMIT = 0
2021-11-28T04:47:39.612552Z307 QuerySET AUTOCOMMIT = 1
2021-11-28T04:47:39.617432Z307 QuerySET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
2021-11-28T04:47:39.622479Z307 QuerySELECT `tweets_tweet`.`id`, `tweets_tweet`.`user_id`, `tweets_tweet`.`content`, `tweets_tweet`.`created_at` FROM `tweets_tweet` WHERE `tweets_tweet`.`user_id` = 1
2021-11-28T04:47:39.627836Z307 Quit
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福