学习和使用Mysql数据库有段时间了,针对自己对MySQL数据库中的锁机制谈一下自己的理解。如有错误欢迎大家指正;
一、按照类型分:
1、读锁(可以理解为共享锁),当A事物对一张表加上该锁则意味着该事物只能对其进行读操作,不能写,同时不能对其他表进行操作,但是并不会阻塞其他事物对该表的读请求。
2、写锁(可以理解为排他锁),当A事物对一张表加上该锁则意味着该事物只能对其进行操作(既可以读也可以写),不能对其它表进行操作,但是会阻塞其他事物对该表的读写请求。
二、按照锁的影响范围分:
1、表级锁:在MySQL中执行引擎MYISAM是为表级锁不支持事物,所以在是使用MYISAM执行引擎对表进行读操作时就会默认为该表添加读锁,同理在写操作时会自动为表添加写锁,至于对其他事物的影响请看上文。
2、行级锁:在MySQL中执行引擎INNODB默认为行级锁,注意该锁是基于索引的,当索引失效时则会自动升级为表级锁,在使用INNODB作为执行引擎时在多某一条数据写操作时会自动为其添加写锁(排他锁),所以会阻塞其他事物对该行数据的读写操作,当事物提交或者回滚之后会将该写锁自动释放,
间隙锁:该种锁是行级锁的一种特殊情况,例如当更新数据时,更新的条件为where id>1 and id <4;那么数据库则会为id = 2,3;这俩条数据添加写锁,这就是间隙锁。
悲观锁:该锁其实就是一种显示添加写多的别称,在执行查询语句时显示的添加排他锁阻塞其他事物对数据的操作就是为悲观锁;
乐观锁:该锁并不属于数据库机制的一种,个人理解这种锁机制是采用CAS无锁思想从而产生的一种锁机制,是为数据库表结构添加一列(一般情况是版本号,然后在对该表数据进行操作时通过该版本号的改变和数据库DDL语句的影响数据行数来判断数据库是否安全的一种锁机制。
3、页锁:小生才疏学浅,目前还没有用到过该类型的锁,欢迎大家补充。
==如有错误欢迎大家指正,本人为java程序员希望结交更多的同行朋友,共同进步。
原文:https://www.cnblogs.com/shijunyong/p/10658815.html