大家好,欢迎来到IT知识分享网。
一、全局锁:
二、表级锁:
有读锁和写锁,加锁和解锁方式如下:
触发表锁的命令:(1)ALTER TABLE;(2)DROP TABLE 或者 TRUNCATE TABLE;(3)LOCK TABLES;(4)全表扫描或者大范围扫描;(5)加全局锁;
风险:(1)性能下降;(2)多表操作,如果没有按照一定顺序操作表,可能会导致死锁;
三、行级锁:
粒度上区分:共享锁和排他锁。
主要由INNODB存储引擎提供,包含共享锁(读锁,也是S锁)和排他锁(写锁,也是X锁)。实际使用中,还有一种间隙锁,会锁定行锁前后的间隙,防止数据插入。
使用场景:(1)高并发读写操作;(2)单行操作;(3)短期锁;(4)实现并发控制;(5)复杂的事务处理;
风险:(1)死锁;(2)锁升级:事务锁定行过多,可能导致上升到表锁;(3)锁等待;(4)资源消耗;(5)难调试和排查;(6)事务隔离级别;
模式上区分:乐观锁和悲观锁。
乐观锁:认为冲突概率低,操作数据时,不会锁定数据,只有在提交修改时,才检查。如果数据已被修改,则回滚,否则提交。
mysql并没有内置乐观锁机制,需要在代码中实现,常见的实现方式是,使用时间戳或者版本号字段,记录每一次对数据的修改。
标志SQL:(1)select id,version from .xxx …;(2)update xxx set … where … and version = 旧version;
乐观锁使用场景:(1)低冲突环境;(2)读多写少场景;(3)短事务操作;(4)分布式系统;(5)互联网应用;
风险:(1)冲突检测:只有提交时才检测,有冲突会导致所有都回滚;(2)依赖于版本管理;
悲观锁:一种并发控制方法。认为冲突概率高,每次读写前都加锁;
使用方式:参考前面提到的共享锁(S锁)和排他锁(X锁);
使用场景:(1)写操作比较多;(2)并发冲突高;(3)业务需要强一致性的场景;
缺点:(1)性能开销;(2)并发降低;(3)死锁;(4)锁超时;
四、意向锁
意向锁是表锁。为了协调行锁和表锁的关系,支持多粒度锁并存(即行锁和表锁)。
意向锁也分共享锁和排他锁。
作用:当事务A有行锁时,mysql自动给该表添加意向锁。当事务B申请整张表的写锁时,只需要判断是否存在意向锁,而不需要判断所有行锁。
意向锁的兼容互斥性:
| 意向共享锁(IS) | 意向排他锁(IX) | |
| 共享锁(S) | 兼容 | 互斥 |
| 排他锁(X) | 互斥 | 互斥 |
五、临键锁
可以理解为一种特殊的间隙锁,临键锁可以解决幻读的问题。
没有commit更新的情况下,新开一个窗口,执行插入语句,年龄在25-30之间,结果插入被阻塞,这就是因为临键锁。
六、记录锁
mysql的innodb引擎的一种锁定机制,用于锁定和控制单个行记录的访问。
记录锁作用在索引上,对于没有主键和唯一键的表,innodb会自动添加隐藏的聚簇索引,并在该索引上加锁。
七、间隙锁
where条件是一个范围时,数据库会锁定区间数据,主要是解决幻读问题。
使用场景:(1)防止幻读;(2)范围查询;
缺点:(1)性能影响;(2)死锁;(3)复杂性;(4)锁定范围过大,可能导致不必要的锁定冲突;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112255.html

