锁:计算机协调多个进程或线程并发访问某一资源的机制 。
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源 。如何保证数据并发的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素 。从这个角度来说,锁对数据库而言显得尤为重要,也更复杂 。
锁的分类1)从对数据操作的类型分为读锁和写锁
2)从对数据操作的粒度分主要有表锁和行锁
读锁和写锁:读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响 。
写锁(排他锁):当前写操作没有完成前,它会阻断其他读和写操作 。
表锁先看一些命令
我们可以手动对一张表加锁,可以是读锁或者写锁,命令:
lock table 表名 read/write,表名 read/write,……【MySQL数据库锁理论】查看表有没有锁的命令
show open tables;
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193H128-0.jpg)
文章插图
In_use的值是0代表没锁,是1代表有锁 。
现在数据库中有一张表,test_lock,现在手动给它加锁,进行一些操作测试 。
一、加读锁
lock table test_lock read;
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193G149-1.jpg)
文章插图
加锁成功,可以用show open tables命令查看
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193KU4-2.jpg)
文章插图
现在可以做一些操作 。
1、读被锁的表:
select * from test_lock;
在当前连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193GU2-3.jpg)
文章插图
可以查询到结果 。
在新连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193I0L-4.jpg)
文章插图
新的连接同样可以查询被锁的表 。
2、查询库中其他表:
select * from test2;
在当前连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193I333-5.jpg)
文章插图
结果报错,无法查询 。
在新连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193ML2-6.jpg)
文章插图
正常,没有影响 。
3、更新被锁的表:
update test_lock set name = 'abcd' where id = '1';
在当前连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193H947-7.jpg)
文章插图
无法更新 。
在新连接中:
执行此语句后,会发现一直在等待,即阻塞了,直到我们把表的锁释放 。
释放锁命令:unlock table;执行释放命令后,新连接中的update语句也马上有了反应,
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193L922-8.jpg)
文章插图
执行等待了1分多钟 。
4、更新库中其他表:
update test2 set name = 'a2' where id = '1';
在当前连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193I339-9.jpg)
文章插图
无法更新
在新连接中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193L4M-10.jpg)
文章插图
在新的会话中,更新其他表是没有影响的 。
二、加写锁
lock table test_lock write;
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193L409-11.jpg)
文章插图
同样,我们在当前会话和和新会话中做一些操作对比 。
1、读被锁的表:
select * from test_lock;
当前会话中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193L507-12.jpg)
文章插图
读没有影响 。
新的会话中:
此时会被阻塞,需要等待释放锁 。
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193H4G-13.jpg)
文章插图
2、查询库中其他表:
select * from test2;
当前会话中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193H514-14.jpg)
文章插图
其他表不能查询 。
新的会话中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193J409-15.jpg)
文章插图
此时不受影响 。
3、更新被锁的表:
update test_lock set name = 'abcd' where id = '2';
当前会话中:
![MySQL数据库锁理论](http://img.jiangsulong.com/220405/19193K0D-16.jpg)
文章插图
可以更新 。
新的会话中:
推荐阅读
- MySQL中Order by 结合 Limit 使用时的潜在陷阱
- 详解MySQL内核对读写分离的支持特性
- MySQL的consul配置这么设计就完整了
- 连锁便利店加盟条件 便利店需要加盟吗
- MySQL索引失效和EXPLAIN工具:你建立的索引真的起到作用了吗?
- MySQL如何选择合适的索引
- Apache ShardingSphere开源的分布式数据库中间件
- 详解MySQL数据恢复
- OPPO手机如何刷机?教程
- 忘记密码,有两种方法可以解锁 iPhone 手机