参考链接
其他
- 关于事务的相关操作
-- 查看事务是否 自动提交
show variables like "%autocommit%";
-- 设置事务的是否自动提交 0=OFF 1=ON
set autocommit=0;
-- 查看msyql 事务的隔离级别
show variables like '%isolation%';
-- 查看全局的和 当前session的
select @@global.transaction_isolation, @@transaction_isolation;
-- 修改全局事务隔离级别
set global transaction isolation level {事务隔离级别};
-- 修改当前会话的事务隔离级别
set session transaction isolation level {事务隔离级别};
-
InnoDB如何在RR隔离界别下避免幻读——next-key锁(行锁 和 GAP锁-间隙锁)
-
事务的隔离级别 实际上都是定义了
当前读的级别,为了减少锁处理的时间,引入了 快照读(不需要加锁,可能读到历史数据),而update,insert这些当前读,可能就需要加锁处理了。 -
快照读(读取历史数据的方式)通常就是 select
-
当前读,特殊的读操作,处理的数据都是当前数据,需要加锁
- select * from xxx where ? lock in share mode;
- select * from xxxx where ? for updates;
- Insert/update/delete;
事务的隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted 读未提交 | ✅ | ✅ | ✅ |
| Read Committed 读已提交 | ❌ | ✅ | ✅ |
| Repeatable Read 可重复读 | ❌ | ❌ | ❌ |
| Serializable 可串行化 | ❌ | ❌ | ❌ |
- 脏读
当前事务读到了其他事务未提交的数据(脏数据),这种现象叫做脏读
- 不可重复读
在该事务中,读取了其他事务提交的数据,导致前后读(select)取同一条数据不一致。
【不可重复读】和【脏读】的区别是:
不可重复读:读取了其他事务提交的数据
脏读:读取了其他事务未提交的数据
- 幻读
在该事务中,前后两次记录数结果不一致
【幻读】和【不可重复读】区别
幻读:侧重于记录的 增长和删除现象
不可重复读:侧重于自己(自己的条件查询记录)的数据变化。
读未提交(Read Uncommitted)
- 定义:
一个事务未提交时,它做的变更,被其他事务看到
- 没有视图的概念
set session transaction isolation level read uncommitted;
show variables like "%isol%";
set autocommit = 0;
show variables like "%autocommit%";
A事务的修改后台,未提交,被B事务查询到了,属于脏数据
读提交(Read Committed)
- 定义:
一个事务做的变更只有他提交后,才可以被其他事务才看到。
- MVCC视图创建时机:
会在每个语句前创建一个,所以在每次查询之前都会重新给予最新的数据,创建一个新的MVCC视图。
set session transaction isolation level read committed;
show variables like "%isol%";
set autocommit = 0;
show variables like "%autocommit%";
可重复读(Repeatable Read)
mysql的默认的隔离级别
可重复读解决了幻读的问题,但是如果你不注意,就会读到 历史数据, 可以使用 Next-key锁(行锁和 GAP锁)来避免数据修改 和 插入造成问题。
- 定义:
事务在执行过程中,看到的数据总是和启动时看到的数据是一致的(当前事务内的更新可以读到)
- MVCC视图的创建时机:
在开始事务后,执行的第一条sql时,创建好了。这个视图会一直使用,直到该事务结束。
注意:A事务提交修改后的信息后,B事务再去更新,可能就会覆盖之前的A事务的值,所以在更新时候,加上更新字段的旧值
set session transaction isolation level repeatable read ;
show variables like "%isol%";
set autocommit = 0;
show variables like "%autocommit%";
可串行化(Searializeble)
- 定义
完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
- 没有视图概念,通过锁来实现数据访问。