mysql锁是mysql为了保证数据的正确性(只允许一个进程操作数据)而做的一系列操作
1:mysql锁分类?
按照锁粒度分为:行锁,页级锁,表锁
常用的存储引擎中:innodb默认支持的是行锁,5.6之后的innodb也支持表锁。
Myisam采用的是表锁
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
按照锁机制分为:排他锁,共享锁
共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改
排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取。
2:mysql锁导致的阻塞/死锁?
阻塞:
当数据库发生改变时,会对修改的表进行加锁(行锁/页锁/表锁),其他事物操作会等待锁释放才会继续执行
死锁(产生的必要条件:互斥,占有且等待,不可抢占,循环等待):
多个线程互相持有对方所需要的资源,导致这些线程一直处于等待中
通俗易懂的理解:比如A和B两个人,一个厕所坑位,一卷卫生纸,A进厕所蹲坑去了,即A占有了坑,
但是A没拿卫生纸,B拿了卫生纸后,B也想上厕所了,发现坑位有人了,那在门外等候,A占有了坑位
,B占有了纸,A想得到纸,但是发现被B占了,都**没纸,怎么出来,B想上厕所,发现厕所被A占
了,那**的怎么办,最后形成了僵持局面,A拿不到纸就占着坑不出去,B进不去坑我就拿着纸,然
后两个就这样一直僵持着,形成了死锁
死锁预防措施?
除了互斥,破坏其他三个条件。为了数据的正确,互斥是必须的。
3:乐观锁,悲观锁?
乐观锁:认为每次操作数据都不会对数据库表发生改变。很乐观,只是在更新这条数据的时候判断一下数据
是否有冲突。
实现原理:
在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次
,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对
那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version
的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将
version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值
不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。
悲观锁:认为每次操作都会对数据库发生改变,很悲观。所以每次操作都会对数据库进行加锁,耗费资源
总结:两者各有优缺点。乐观锁适合多读的情况,如果业务修改异常频繁的话,只能用悲观锁保证数据
的正确