mysql中锁Name_locked为0_Mysql 图解锁机制

MySQL 锁机制

MySQL锁: 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中, 数据是一种供许多用户共享的资源. 因此需要借助锁来解决数据并发访问的一致性、有效性

MySQL锁的分类:

从对数据操作的类型分: 读锁、写锁

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

写锁(排他锁): 当前写操作没有完成前, 它会阻断其他写锁和读锁

从对数据操作的粒度分: 表锁、行锁

表锁: 偏向MyISAM存储引擎, 开销小加锁快, 无死锁(锁粒度大, 发生锁冲突的概率最高, 并发度最低)

行锁: 偏向InnoDB存储引擎, 开销大加锁慢, 会出现死锁(锁粒度小, 发生冲突的概率最低, 并发度最高)

前面只是对 (读锁、写锁)、(表锁、行锁), 一个大概的解释或者说是结论. 接下来笔者将举详细的例子解释锁机制, 分别会从以下角度解析:

表锁(MyISAM存储引擎)下, 分别加 读锁 和 写锁. 会对多个连接MySQL会话的造成什么影响 ?

行锁(InnoDB存储引擎)下, 分别加 读锁 和 写锁. 会对多个连接MySQL会话的造成什么影响 ?

在此之前我们需要先熟悉一下的几个MySQL命令操作

show open tables; # 查看所有数据库中正在打开的非临时表

show open tables from 数据名 where `Table` = '表名'; # 查询指定数据库指定表的是否打开(使用或锁住)

show open tables from test where `Table` = 'mylock';

47b2d97f7857f258b15ea4938dc23b6e.png

Database: 数据库名称

Table: 表名

In_use: 打开表的表锁的次数, 0 代表未打开, 1 代表 表已锁住

Name_locked; 表名是否被锁, 0 代表未锁, 只有当删除表时或者重命名表名时, 才为1

lock table 表名1 read|writer, 表名1 read|writer, ...; # 手动为表加上 读锁 或者 写锁

lock table mylock read; # 为 mylock表加上读锁

show open tables from test where `Table` = 'mylock';

052e594615c3fbeec371f404f2b90905.png

unlock tables; # 释放锁有的锁

1.0.1: 表锁(MyISAM存储引擎)下, 加读锁, 对多个连接MySQL(并发)会话的造成影响

表锁(MyISAM存储引擎), 在使用SELECT查询语句前, 会自动给涉及的所有表加读锁, 查询操作完成之后会释放锁

由于读锁的添加和释放由MySQL自动完成, 且无法具体捕获加锁和释放锁的时机, 因此需要手动通过命令加锁和释放锁

# 创建存储引擎为MyISAM的mylock表

create table mylock(

id int not null primary key auto_increment,

name varchar(20)

)engine myisam;

# 插入5条数据

insert into mylock(name) values('a');

insert into mylock(name) values('b');

insert into mylock(name) values('c');

insert into mylock

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值