# 事务

* 事务的并发问题
  * 脏读
  * 不可重复读
  * 幻读

## 隔离级别

查看当前隔离级别

`SELECT @@tx_isolation;`

设置隔离级别

`SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;`

mysql默认是自动提交事务。所以要想使用事务则得关闭自动提交

```sql
SET autocommit=1;
```

## `READ UNCOMMITTED`隔离级别下

1. 事务还没有提交，就被其他session进程读取了对应的数据
2. 当事务进行回滚时,数据有变回原来的样子，就是所谓的幻读

## `READ COMMITTED`隔离级别下

只有事务在`commit`之后，读取的数据才是正确的，避免了脏读的存在

因此在另外一个session读取数据的过程中就会导致幻读的存在，在`commit`之前是一种状态，提交之后又是另外一种状态

## `REPEATABLE READ`隔离级别

在该隔离级别在时，第一个session使用SQL语句修改了数据，第二个session去查询的时候，只有第二个session提交之后才能够看到修改之后的数据，解决了脏读和不可重复读的问题。

不可避免`幻读`问题

当一个session在插入数据提交后，另外一个session还没有commit时，会读到第一个session提交的数据。

## `SERIALIZABLE`隔离级别

串行化，给session加上锁，避免了事务中的几个问题

## `SAVEPOINT a`设置保存点

使用`ROLLBACK TO a`回滚到对应的保存点
