doc: 阅读mysql transaction文档

This commit is contained in:
2025-08-29 00:00:43 +08:00
parent ced1d2db95
commit f6cacead3d

View File

@@ -671,3 +671,59 @@ leader可能会注册到一个非空queue中即leader可以决定成为一个
> 通过将sessions在stage queue进行排队在write、sync、commit多个阶段都能进行group处理。这样能够提高多事务场景下的事务提交性能通过binary log group commit也能大大减少fsync的磁盘写入次数。 > 通过将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`来获取共享锁,保证事务在处理过程中没有其他的事务可以修改数据。