关于python:Django-ORM-和-sqlalchemy-在每次发起数据库请求前对残留事务的清理操作

7次阅读

共计 1151 个字符,预计需要花费 3 分钟才能阅读完成。

Django 会在每次申请之前先执行

  • SET AUTOCOMMIT = 0
  • SET AUTOCOMMIT = 1
  • SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

而后在执行咱们须要的 CRUD 操作

下面的三步操作能够认为是准备操作(然而在 Django 的 ORM 日志中不会记录)。

你可能会纳闷,为什么要先 SET AUTOCOMMIT = 0SET 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.604596Z      307 Connect    root@192.168.31.100 on d_twitter_db using TCP/IP
2021-11-28T04:47:39.608104Z      307 Query    SET AUTOCOMMIT = 0
2021-11-28T04:47:39.612552Z      307 Query    SET AUTOCOMMIT = 1
2021-11-28T04:47:39.617432Z      307 Query    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
2021-11-28T04:47:39.622479Z      307 Query    SELECT `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.627836Z      307 Quit

sqlalchemy 呢?如何解决上次事务的残留?

就是把 Django ORM 的 SET AUTOCOMMIT = 0 替换为了 ROLLBACK

正文完
 0