doc: 阅读mysql transaction文档
This commit is contained in:
@@ -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`来获取共享锁,保证事务在处理过程中没有其他的事务可以修改数据。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user