1、隔离级别分类:
0、SERIALIZABLE:串行执行
1、REPEATABLE READ (默认) :可重复读 ,含有mvcc,含有Next-key lock
2、READ COMMITTED:可提交读 ,含有mvcc
3、READ UNCOMMITTED :未提交读,当前读
2、如何设置当前事务隔离级别:
#设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
#查看当前会话隔离级别
SELECT @@session.tx_isolation;
3、测试结果
1、RR 隔离级别下面 对select 的影响 ?
0、以第一条select 语句为基点创建快照,只要使用了一次select ,后续select 的值不会受其他事务影响。含有mvcc 实现
1、当前事务 select 只能查询到数据版本号在当前事务之前的版本。(select 只读当前快照,没有锁)
2、当前事务 不能看到其他事务修改的数据,包括已提交的数据。
2、RR 隔离级别下面 对Next-Key 的影响 ?
1、当前事务update 操作默认加上Next-Key lock。而不是只加锁指定的记录。 其他事务隔离级别下面 update 只会锁定已查找到的记录
2、 Next-Key lock 的范围内,其他事务对相关记录的操作(update ,delete ,insert )将被挂起。普通的select 操作无影响
3、 Next-Key lock 在RR 以上级别生效。
3、RC 隔离级别下面 对select 的影响? mvcc 实现
1、RC 级别的每一次select 都能看到其他事务已提交的数据。
2、RC 级别都有自己的数据版本,当数据提交后。数据版本升级为最新的。
4、RU隔离级别下面 对select 的影响? 无mvcc 实现
1、RC 级别的每一次select 都能看到最新的修改,包括未提交的数据。
4、锁与sql 语句关系
快照读: 如果有mvcc 版本控制,那么将按照版本读取数据。不会加锁
select * from table where ?
当前读:特殊的读操作,插入/更新/删除操作,属于当前读 加锁。会阻塞其他操作。
select * from table where ? lock in share mode ;
select * from table where ? for update ;
update table set ? where ? ;
delete from table where ? ;
5、锁与事务隔离与mvcc 关系
1、事务隔离级别 与mvcc 关系
RR ,RC 级别,用不同数据版本来实现事务隔离。避免了加锁。这样就更加高效 不同的事务隔离级别,看到不同的数据版本
2、事务隔离级别 与锁的相关性
RR 级别 隐含实现了 Next-Key lock 。RR 级别下面的 会加强显示锁的区别,来保证 隔离级别的正确性。
3、事务隔离级别 与锁的无性
如下语句:都会对选中的记录加锁,独占锁的方式。不管事务是何种隔离级别
select * from table where ? lock in share mode
select * from table where ? for update ;
update table set ? where ? ;
delete from table where ? ;
6、总结
1、行数据的 事务ID 与数据版本属性。数据版本递,按照数据修改发生的时间。事务ID 递增,按照创建事务的时间。
2、数据修改(有锁,行锁,间隙锁),使用当前读更新。并且每次更新都会记录一次数据版本。不能丢失所有事务的更新,所有事务的更新应该是"串行"执行。
3、数据读,在行数据的版本历史上面查找哪些事务ID 可见(无锁)。但是也可以使用当前读语句获取最新的数据版本(有锁)