| 时间点 | 事务A | 事务B |
|---|---|---|
| 1 | 开启事务A | |
| 2 | 开启事务B | |
| 3 | 查询余额为100 | |
| 4 | 修改余额为150 | |
| 5 | 查询余额为150 | |
| 6 | 事务回滚 |
| 时间点 | 事务A | 事务B |
|---|---|---|
| 1 | 开启事务A | |
| 2 | 开启事务B | |
| 3 | 查询余额为100 | |
| 4 | 修改余额为150 | |
| 5 | 查询余额为100 | |
| 6 | 提交事务 | |
| 7 | 查询余额为150 |
| 时间点 | 事务A | 事务B |
|---|---|---|
| 1 | 开启事务A | |
| 2 | 开启事务B | |
| 3 | 查询id<3的所有记录,共3条 | |
| 4 | 插入一条记录id=2 | |
| 5 | 提交事务 | |
| 6 | 查询id<3的所有记录,共4条 |
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | √ | √ | √ |
| READ COMMITTED | × | √ | √ |
| REPEATABLE READ | × | × | √ |
| SERIALIZABLE | × | × | × |
√代表会出现问题,×代表不会出现问题
SERIALIZABLE级别会将整个表都锁住,严重影响并发执行效率,所以一般工作中不使用,使用最多的是REPEATABLE READ
设置事务隔离级别代码
-- 查看默认的事务隔离级别 MySQL默认的是repeatable read
select @@transaction_isolation;
-- 设置事务的隔离级别 (设置当前会话的隔离级别)
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
原文:https://www.cnblogs.com/shanlei/p/14333083.html