深入理解MYSQL锁和事务隔离级别
2021-04-18 20:37:25 0 举报
深入理解MYSQL锁和事务隔离级别
作者其他创作
大纲/内容
不冲突,提交修改的数据
事务B
数据库操作的类型上分
共享数据
导致的问题
不支持行锁
悲观锁
原子性
1、查询出数据为10
线程B
MYISAM
幻读
读锁
结果集一样
表锁
2条记录
insert语句id =6
线程A
1、修改为5
用户自己决定
幻读问题
读取数据A
3、然后修改为8
不可重读
增删查改/都会堵塞
事务A
八点
乐观锁
结果集不一样
查询语句
A=true
A=false
2、读到脏数据
检查版本控制
对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。
会堵塞
写锁(排它锁)
3、修改为4
Innodb在repeatable-read{可重复读}提交下为了解决幻读问题时引入的锁机制
读
在事务开始和完成时,数据必须保持一致状态,保证数据的完整性
这个范围所包含的所有行记录(包括间隙行记录)以及行记录所在的间隙里插入或修改任何数据
4
版本不冲突
加锁范围
读已提交READ-COMMITTED
冲突,返回错误信息
同个事务在不同时刻下可以重复读到一样的数据
提交了
8
隔离性
在可重复读级别下一定情况解决
10
最后数据结果为8
5
3条记录
脏写
持久性
增删查改操作
九点
事务隔离级别
可以读到其他事务已经提交的数据
每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。
导致了脏读问题
1、先查询出数据10
读未提交READ-UNCOMIMTTED
事务A回滚
乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。
有四个区间
行锁
2、然后更新为5
版本控制
可以读到其他事务未提交的数据
还没提交
可重复读Repeatable-read
导致更新5的数据丢失
事务完成之后,它对数据的修改是永久性
可串行化serializable
每次操作锁住一行数据,开销大,加锁慢(先找到那行数据,效率慢);出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度最高。
线程A查询表
事务
加锁,其他线程B在这区间插入数据会堵塞
(10,15)
锁的就是两个值之间的空隙
查询语句id<9
共享数据A
锁是计算机协调多个线程和线程并发访问某一资源的机制
修改数据A会堵塞
(3,10)
5(脏数据)
读锁(共享锁)
间隙锁
一致性
其对数据的修改,要么全部执行,要么全不执行,相当于一个操作。主要在操作层面
保证事务在不受外部并发操作影响
脏读
CAS实现
所有查询,更新都要加锁
更新非索引值
可重读
0 条评论
回复 删除
下一页