From f6cacead3d25398d0e32e6335142ceb1dc4e2a0a Mon Sep 17 00:00:00 2001 From: asahi <496063163@qq.com> Date: Fri, 29 Aug 2025 00:00:43 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBmysql=20transaction?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_事务.md | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/mysql/mysql文档/mysql_事务.md b/mysql/mysql文档/mysql_事务.md index f690bcd..27f211b 100644 --- a/mysql/mysql文档/mysql_事务.md +++ b/mysql/mysql文档/mysql_事务.md @@ -671,3 +671,59 @@ leader可能会注册到一个非空queue中,即leader可以决定成为一个 > 通过将sessions在stage queue进行排队,在write、sync、commit多个阶段都能进行group处理。这样能够提高多事务场景下的事务提交性能,通过binary log group commit也能大大减少fsync的磁盘写入次数。 +### 事务控制语句 +在默认设置下,mysql命令行的事务为自动提交的,在执行完sql后马上就会执行commit操作。可以通过`begin`和`start transaction`命令显式的开启一个事务。 + +事务的控制语句如下: +- `start transaction|commit`:显式开启一个事务 +- `commit`:提交事务 +- `rollback`:回滚事务 +- `savepoint identifier`:savepoint指令允许在事务中创建一个保存点,一个事务中允许有多个保存点 +- `release savepoint identifer`:删除一个事务的保存点,当保存点不存在时会抛出异常 +- `rollback to [savepoint] identifier`:该指令用用于将事务回滚到指定的保存点。该指令通常和`savepoint`一起使用 +- `set transaction`:该指令用于设置事务的隔离级别,innodb存储引擎提供了`read uncommitted`,`read committed`,`repeatable read`,`serializable`四种隔离级别 + +在mysql中,`start transaction`和`begin`都能够开启一个事务,但是在存储过程中,mysql会自动将`begin`识别为`begin ... end`,`故而在存储过程中只能通过start transaction来开启事务`。 + +#### rollback +在mysql中,一条语句的执行,要么完全成功,要么完全回滚,`并且一条语句失败抛出异常时,并不会导致之前已经执行的语句回滚`,所有的修改都会保留,必须由用户来决定是否对其进行提交或回滚。 + +#### rollback to savepoint +`rollback to savepoint`语句并不会实际的对事务进行提交或回滚,而是将事务恢复到一个保存点的状态,在执行完`rollback to savepoint`后,仍然需要用户对事务进行整体的提交或回滚。 + +### 事务操作统计 +innodb存储引擎是支持事务的,故而使用innodb存储引擎的应用除了要考虑`每秒请求数`(QPS)之外,还需要考虑每秒的事务处理能力(`TPS`)。 + +TPS的计算方式如下:`(com_commit + com_rollback)/time`。使用该计算方式的前提为`所有事务都是显式提交/回滚的`,如果存在隐式的提交/回滚,则并不会计算到`com_commit/com_rollback`变量中。 + +### 事务隔离级别 +如果想要设置事务的隔离级别,可以使用如下命令 +```sql +set [global | session] transaction isolation level +{ + read uncommitted + | read committed + | repeatable read + | serializable +} +``` +如果想要在事务启动时就设置事务的默认隔离级别,需要修改mysql的配置文件,在`[mysql]`中添加如下内容: +``` +[mysql] +transaction-isolation=READ-COMMITTED +``` +如果需要查看当前的事务隔离级别,可以按照如下方式: +- session: + - `select @@tx_isolation` +- global + - `select @@global.tx_isolation` + +在serializable隔离级别下,innodb会为每个select语句都自动添加`lock in share mode`,故而对`非锁定读`不再支持。(写操作发生时会占用排他锁,而排他锁和共享锁互斥)。 + + + +### 长事务 +长事务是指执行时间较长的事务,对于长事务而言,因硬件或操作系统发生问题导致事务回滚的代价是难以接受的(事务回滚花费的时间甚至会多于正向执行时花费的时间)。对于长事务而言,有时可以通过将其转化为小批量的事务来处理。当事务发生错误时,可以仅回滚一小部分数据,然后从上次已经完成的部分来继续处理。 + +在事务执行前,可以先通过`lock in share mode`来获取共享锁,保证事务在处理过程中没有其他的事务可以修改数据。 +