Mysql锁

一:Mysql支持的锁类型和特点?
1:表级锁:开销小,粒度大,加锁快,并发度低,发生锁冲突的概率最高
2:行级锁:开销大,粒度小,加锁慢,并发度大,发生锁冲突的概率最低
3:页面锁,开销和加锁时间介于表级锁和行级锁之间,会出现死锁。
二:不同存储引擎锁支持的锁类型。
主要分析inndb和myisam存储引擎。
myisam使用的是表级锁,inndb支持的是行级锁好表级锁。
2.1:myisam表锁:
myisam也有两种锁模式:表共享读锁和表独占写锁。
表共享读锁:不会阻塞其他用户对同一张表的读请求。
表独占写锁:会阻塞其他用户对同一张表的读和写操作。
2:如何是myisam支持并发?
如果没有设置的话,myisam的所有操作都是并行操作的,但是如果设置了concurrent_insert值就会允许并发操作
其中
当 concurrent_insert =0的时候不允许并发
当 concurrent_insert=1的时候,如果表中没有空洞,就会允许并发插入
当concurrent_insert=2的时候,无论保重是否存在空洞都允许从表位并发插入
空洞:表中没有被删除的行
3:锁调度
我们都知道myisam是读写串行的,那如果一个进程过来一个读锁,一个进程过来一个写锁,那么怎么处理这个优先级。myisam默认是先执行写锁,应为myisam认为写的优先级比较高。这就会造成大量阻塞,导致myisam不使用存在大量读写请求的系统。但是我们可以设置调整myisam的去写优先级。使得读操作的优先级提高,不会导致大量读操作饿死。
2.2:inndb锁
inndb是支持行锁和表锁的。
首先分析事物的四个特征:
原子性:事物对于数据的修改要么成功执行,要么全部不执行
一致性:事物开始和完成后,数据都必须保证一致性
隔离性:不同事务之间都是独立的,不会相互影响。
持久性:事务完成之后,对于数据的修改是永久性。
那么并发就会带来以下问题:
1:更新丢失:如果多个事务都操作同一条数据,那么最后的更新结果会导致数据覆盖
2:脏读:如果一个事务在执行写操作,并且没有提交事务,另外一个事务在执行读请求,就会查询到未提交的数据
3:幻读:如果一个事务在查询符合条件内的数据,另外一个事务新增了一条该条件内的数据,就会导致再次查询的时候就会查询出不一样的结果
4:不可重复读:一个事务在执行查询操作,另外一个事务在修改查询结果集内的数据,就会导致再次查询的时候结果不一致。
事务隔离级别:
1:读未提交
2:读提交
3:可重复读
4:可序列化
2.3 inndb的行锁模式和加锁方法
inndb有两种行锁
1:共享锁
允许事务读取一行数据,阻止其他事务获得相同数据集的排他锁
2:排他锁
允许获得怕他所的事务更新数据,阻止七天事务获得相同数据集内的共享锁和排他锁
2.4 inndb行锁实现方式
inndb是通过索引上的索引项加锁来实现的,而Oracle是通过数据亏啊对应数据行加锁来实现了。
所以inndb只有通过索引行检索的数据才会使用行锁,否则会使用表级锁。
所以,如果索引失效的话,会存在大量锁冲突
2.5 间隙锁
如果我们使用的是范围条件检索数据,会给已有数据记录的索引加上间隙锁,解决幻读问题。
2.6什么时候使用表锁
1:如果事务更新大部分数据,如果使用行锁执行效率更低,那么就会考虑使用表锁来执行该事务
2:如果事务涉及多张表,容易引起死锁,就会考虑一次性给所有事务涉及的表加锁。
Mysql锁