文档:https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html

获取、设置隔离级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...

transaction_characteristic: {
ISOLATION LEVEL level
| access_mode
}

level: {
| READ UNCOMMITTED
| READ COMMITTED
REPEATABLE READ // 5.7默认
| SERIALIZABLE
}

access_mode: {
READ WRITE
| READ ONLY
}

// 设置
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE

// 查询配置
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only; // 全局
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only; //Session

// 自动提交
show variables like 'autocommit';– 查看当前的自动提交是否开启
set autocommit = off;– 将自动提交关闭

脏读

某个事务更新一份数据,另一个在此时读取额同一份数据,前一个事务rollback了,则另一个事务读取的数据就是脏数据。

image-20230614114903603

事务隔离修改成读已提交

image-20230614115850685

不可重复度

一个事务两次查询数据不一致,当事务A第一次查询数据后,并没有及时commit或者rollback,这时事务B插入了一条新的数据,但是现在事务A又查了一次数据库发现和前面第一次查的数据内容不一致。(这种像是特性,不像是问题,但是根据隔离性规定事务AB之间的数据应该不能被互相干扰的)

image-20230614140927133

事务隔离级别提升为可重复读,然后又会有幻读的问题

image-20230614141321155

幻读

一个事务两次查询数据不一致,导致事务更新会携带上不该有的数据记录。事务A第一次查询时有1条数据,事务B插入一条数据,这时事务A又去更新数据发现更新影响条数为2条,导致数据不一致。

image-20230614143541138

通过序列化级别处理,此时并不能并发了。

image-20230614144212869