MySQL2
1、事务的属性与隔离级别
属性
- 原子性:事务要么完成,要么不起作用,不允许分割
- 一致性:数据库从一种一致性状态转移到另一种一致性状态
- 隔离性:并发事务之间数据库是独立的
- 持久性:事务提交回滚之后对数据库的改变是持久的
事务隔离级别
-
READ_COMMITTED(读已提交) 允许读取并发事务已经提交的数据 可能导致幻读、不可重复读
-
READ_UNCOMMITTED(读未提交) 最低 允许读未提交的数据 可能导致脏读、幻读、不可重复读
-
REPETABLE_READ(可重复读) 解决不可重复读的问题 实际业务需求
不可重复读现象:因为其他并发事务的提交导致相同查询不同的结果
-
SERIALIZABLE(串行化) 最高的隔离级别 防止脏读、幻读、不可重复读
2、MVCC(Multi-Version Concurrency Control 多版本并发控制)
在REPETEAED_READ READ_COMMITTED 隔离级别下的事务执行普通的select操作访问记录的版本链的过程,可以使不同事务的读__写、写__读操作并发执行。
版本链表 除了原有的列之外事务id与回滚指针
ReadView是一个集合存放begin之后未commit与rollback的事务,查询的时候拿着事务id去比较看id在不在ReadView中如果不在就读 如果在就利用地址指针到下一个版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIkHbeqr-1584771834281)(D:\自己总结的资料\T&X\typora\PIC\ReadView.png)]
两种级别的ReadView生成时机不同 READ_COMMITTED每次select都会生成一个ReadView REPETEAED_READ只在第一次select的时候生成
3、锁机制
-
默认一条SQL会自动开启事务提交事务
-
DDL会自动提交事务(create drop alter) {DQL查询select,DCL 权限相关}
-
锁会在事务提交后释放
-
共享锁相互兼容
-
排他锁与任何锁不兼容
-
select操作默认不加锁
-
可以使用lock in share mode给select加共享锁 使用for update加排它锁
-
update insert delete默认添加排他锁
-
事务隔离级别为串行化时默认添加共享锁
-
悲观锁:每个查询都添加共享锁不希望别人修改自己正在读的信息
乐观锁:查询的时候不加锁之后进行比对
-
行锁只对一行添加锁
-
表锁与意向锁 添加表锁会对表中的每一行进行比对如果发现行锁 则不添加 为了提高比较效率可以对存在行锁的表添加意向锁
-
间隙锁:
-
RC级别中加行锁不会影响不存在的数据 只锁当前查到的
-
RR级别中如果是对索引加的锁会出现间隙锁影响未添加的数据 不是对索引加的锁则会锁住全表