本篇文章带大家了解一下Mysql中的锁,搞懂共享锁、排他锁、悲观锁、乐观锁,并聊聊使用场景,希望对大家有所帮助!
show variables like '%storage_engine%';
MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。
而 InnoDB 与 MyISAM 的最大不同有两点:一是 InnoDB 支持事务;二是 InnoDB 采用了行级锁。
在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。
InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。
数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。
共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但无法修改。要想修改就必须等所有共享锁都释放完之后。
排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人无法进行任何操作。
//共享锁 select * from 表名 lock in share mode //排他锁 select * from 表名 for update
T1: select * from 表名 lock in share mode //假设还未返回结果 T2: update 表名 set name='autofelix'
T1: select * from table lock in share mode T2: select * from table lock in share mode
T1: 开启事务,执行查询更新两个操作 select * from table lock in share mode update table set column1='hello' T2: 开启事务,执行查询更新两个操作 select * from table lock in share mode update table set column1='world'
T1: begin update table set content='hello' where id=10 T2: begin update table set content='world' where id=20
T1: begin select * from table for update update table set content='hello' T2: begin select * from table for update update table set content='world'
T1: begin select * from table [加更新锁操作] update table set content='hello' T2: begin select * from table [加更新锁操作] update table set content='world'
update table set num=num-1 where id=10 and version=12
【相关推荐:mysql视频教程】
以上就是深入了解Mysql中的锁,聊聊使用场景!的详细内容,更多请关注php中文网其它相关文章!
已抢17006个
抢已抢49955个
抢已抢184261个
抢已抢66102个
抢已抢350403个
抢已抢664237个
抢