第十八章 MySQL锁机制

概念

锁是计算机协调多个进程或线程并发访问某一资源的机制。

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

案例

在这里插入图片描述

锁的分类

  • 按照对数据的操作类型分为:读锁、写锁;
  • 按照对数据的操作粒度分为:表锁、行锁。

读锁

又称为共享锁,针对同一份数据,多个读操作可以同时进行而不会互相影响。

写锁

又称为排他锁,当前写操作没有完成前,它会阻断其他写锁和读锁。

三锁

  • 表锁(偏读)

特点

偏向于MyISAM存储引擎,开销小,加锁快;锁定粒度大,发生锁冲突的概率最高,并发度最低。

案例分析

# 表级锁分析
create table if not exists mylock(
id int not null primary key auto_increment,
name varchar(20)
)engine myisam;

insert into mylock(name) values
('a'),('b'),('c'),('d'),('e');

select * from mylock;

在这里插入图片描述
手动增加表锁:

格式:lock table 表名字 read(write),表名字2 read(write),其他;

查看当前有锁的表:show open tables
在这里插入图片描述
加锁

# 一个上读锁,一个上写锁
lock table mylock read,book write;

在这里插入图片描述
解锁

unlock tables;

mylock添加read锁(读阻塞写例子)

1、读锁是可以共享的。
在这里插入图片描述
2、读锁是不可以进行自我修改操作的,同时其他session会发生阻塞排队现象。
在这里插入图片描述
3、未解锁之前也不能读其他表,其他session不受影响。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mylock添加write锁(写阻塞读例子)

1、自己可以读自己的表,也不一样更新自己的表,还是不能读其他表
在这里插入图片描述
2、其他session可以读未加锁的表;
在这里插入图片描述
3、其他session读发生阻塞;
在这里插入图片描述
在这里插入图片描述

总结:

在这里插入图片描述
在这里插入图片描述
分析:
在这里插入图片描述
在这里插入图片描述
Myisam的读写锁调度是写优先,这也是Myisam不适合做写为主表的引擎。以为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永久的阻塞。因此,表锁偏读的原因,适合淘宝的买家而不是卖家,多用于查询。

  • 行锁(偏写)

  • 页锁(了解)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值