MYSQL_06Mysql事务隔离级别与锁机制
2023-04-13 14:48:44 21 举报
AI智能生成
Mysql事务,隔离级别,锁机制
作者其他创作
大纲/内容
事务及其ACID
ACID属性
原子性(Atomicity)
一致性(Consistent)
隔离性(Isolation)
持久性(Durable)
并发事务处理带来的问题
更新丢失(Lost Update)或脏写
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新
脏读(Dirty Reads)
事务A读取到了事务B已经修改但尚未提交的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求
不可重读(Non-Repeatable Reads)
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”
事务A内部的相同查询语句在不同时刻读出的结果不一致,不符合隔离性
幻读(Phantom Reads)
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
务A读取到了事务B提交的新增数据,不符合隔离
事务隔离级别
读未提交RU
脏读可能
不可重复度可能
幻读可能
读已提交RC
脏读不可能
不可重复度可能
幻读可能
可重复读
脏读不可能
不可重复度不可能
幻读可能
数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大
因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。
Mysql默认的事务隔离级别是可重复读
用Spring开发程序时,如果不设置隔离级别默认用Mysql设置的隔离级别,如果Spring设置了就用已经设置的隔离级别
锁详解
锁分类
性能上
乐观锁
悲观锁
数据库操作的类型
读锁
写锁
对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作
对数据操作的粒度
表锁
每次操作锁住整张表。开销小,加锁快;不会出现死锁
锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景
行锁
每次操作锁住一行数据。开销大,加锁慢;会出现死锁
锁定粒度最小,发生锁冲突的概率最低,并发度最高
InnoDB支持行级锁
间隙锁(Gap Lock)
锁的就是两个值之间的空隙
临键锁(Next-key Locks)
Next-Key Locks是行锁与间隙锁的组合
例子
假设间隙就有 id 为 (3,10),(10,20),(20,正无穷) 这三个区间
这个(3,20]的整个区间可以叫做临键锁
锁优化建议
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围
尽可能减少检索条件范围,避免间隙锁
尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
尽可能低级别事务隔离
0 条评论
下一页