MySQL之锁对象

MySQL之锁对象

一 锁概述

锁是计算机协调多个进程或线程并发访问某一资源的的机制。
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

二 锁分类

1 从对数据操作的粒度分:
(1)表锁:操作时,会锁定整个表
(2)行锁:操作时,会锁定当前操作行
2 从对数据操作的类型分
(1)读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会影响
(2)写锁(排它锁):当前操作没有完成之前,他会阻断其他写锁和读锁

三 MySQL锁

相对于其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的锁机制。下表中罗列各种储存引擎对锁的支持情况:
在这里插入图片描述
MySQL这3种锁的特性可大致归纳如下:
在这里插入图片描述
表级锁更适合以查询为主,只有少量按索引条件更新数据的应用,如web应用;行级锁适合有大量按索引条件并发更新少量不同数据,同时又有查询的应用,如一些在线事务处理系统(OLTP)

四 MYISAM表锁

1 如何加表锁
MYISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作(update、insert、delete)前,会自动给涉及的表加写锁,这个过程不需要用户干预。
显示加表锁语法

加读锁:lock table 表名 read;
加写锁:lock table 表名 write;

2 案例
(1)案例1:加读锁
在这里插入图片描述
① 客户端1加读锁后,查询语句可以,写语句不行;客户端2也可以查询;读锁具有共享的特性
② 客户端1加读锁后,更新语句可以;客户端2更新进入阻塞状态,需要客户端1解锁,客户端2才能更新
在这里插入图片描述
(2) 案例:写锁
① 客户端1加写锁,可以进行增删改查操作,客户端2 会进入等待,需要客户端1解锁才能继续操作
在这里插入图片描述
总结:读锁会阻塞写,但是不会阻塞读;写锁会阻塞读和写
MYISAM的读写锁调度是写优先,这也是MYISAM不适合做以写为主的表的存储引擎的原因,因为写锁后,大量的更新会使查询很难得到锁,从而造成永远阻塞。

五 查看锁的争用情况

1 show open tables;
(1)In_user:表当前被查询使用的次数,值为0表示表是打开的,但是没有被使用
(2)Name_locked:表名称是否被锁定,名称锁定用于取消表或对表进行重命名操作
在这里插入图片描述
2 show status like ‘Table_locks%’;
(1)Table_locks_immediate:指的是能够立即获得表级锁的次数,每次获取锁,值加1
(2)Table_locks_waited: 指的是不能立即获取表级锁而需要等待的次数,等待一次,值加1,值越高说明表级锁争用情况越严重
在这里插入图片描述

六 InnoDB行锁

1 行锁介绍
行锁特点:
① 开销大,加锁慢,会出现死锁
② 锁定粒度小,发生锁冲突的概率最低,并发度也最高
③ InnoDB与MYISAM的最大不同点是:支持事务和采用行级锁
2 事务及特性
(1)事务是由一组SQL语句组成的逻辑处理单元。
(2)ACID四大特性
在这里插入图片描述
(3)并发事务的问题
在这里插入图片描述
(4)事务隔离级别
为了解决并发事务的问题,数据库提供一定的事务隔离机制来解决,数据库隔离级别越高,并发副作用越小,但代价也越高,所以也不是隔离级别越高越好,InnoDB默认为
可重复读在这里插入图片描述
可以通过show variables like ‘tx_isolation’;来查询数据库的默认隔离级别

3 InnoDB的行锁模式
(1)共享锁:又叫做读锁,简称S锁,共享锁就是多个事务对于同一个数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
(2)排它锁:又叫做写锁,简称X锁,排它锁不能和其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能再获取该行的其他锁,包括共享锁和排它锁,但是获取排它锁的事务可以对数据进行读写操作。
对于updata、delete、insert语句,InnoDB会自动给数据集加排它锁;对于select语句,InnoDB不会加如何锁
可以显示个记录集加锁

共享锁:select * from t_user where ....**lock in share mode**;
排它锁:select * from t_user where ....**for update**;

(3)案例:
在这里插入图片描述
行锁的基本演示
InnoDB select不会涉及到锁,update、delete、insert有行级锁和排它锁。
在这里插入图片描述
在这里插入图片描述
(4) 无索引行级锁升级到表级锁
如果不通过当前表的索引条件检索数据,那么InnoDB将对表的所有记录加锁,实际效果类似表级锁
查看当前表的索引
在这里插入图片描述
由于执行更新时,name字段本来是varchar类型,结果使用int类型,存在类型转换导致索引失效,最终变成表锁。
在这里插入图片描述
(5)间隙锁的危害
当我们使用范围条件而不是相等条件检索数据,并请求共享或排它锁时,InnoDB会给复合条件的已有数据进行加锁,对于键值在条件范围内但是真实并不存在的记录加间隙锁,这种机制就是所谓的间隙锁(Next-key锁),开发时需要避免间隙锁。
案例;
在这里插入图片描述
(6)InnoDB行锁争用情况
查看行锁情况

show status like ‘innodb_row_lock%

在这里插入图片描述
(7)优化建议
① 尽可能让数据检索都能通过索引来完成,避免无索引行锁升级为表锁
② 合理设计索引,尽量缩小锁的范围
③ 尽可能减少查询条件及查询范围,避免间隙锁
④ 尽可能控制事务大小,减少锁定资源量和时间长度
⑤ 尽可能使用低级别事务隔离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值