MySQL并发机制(二)——表锁

表的共享、独占锁:

共享锁:

类似于 JUC 下的 ReentrantReadWriteLock 下的 读锁。多个事务可以同时为数据加锁,同时访问到数据。

独占锁:

类似于 JUC 下的 ReentrantReadWriteLock 下的 写锁。同一时间,只能有一个事务获取为数据加锁。
只能有一个事务访问到数据
 

不同存储引擎的锁:

默认情况下:在对某个表执行SELECT、INSERT、DELETE、UPDATE语句时
(1): InnoDB 是不会为这个表添加表级别的 S锁 或者 X锁 的, Innodb 添加的锁一般都是行级别的锁
(2):MyISAM 添加的锁一定是表级别的锁,MyISAM 不支持行级别的锁
 

注:我们可以通过使用以下命令为 Innodb  加上表级别的锁

LOCK  TABLES  t  READ :对表  t  加表级别的 共享锁 
LOCK  TABLES  t  WRITE :对表 t  加表级别的 独占锁 
MyISAM 引擎也要通过 以上命令手动加锁,在访问数据时,MyISAM默认不加锁
 

意向锁:

问题:

当我们想对 Innodb 存储引擎添加表级别的独占锁时,我们需要判断,该表中不能存在任何锁。
我们如何判断在表中是否存在行级别的锁呢?
方案一:遍历表中的数据,一个个记录的判断是否有行级锁(该方案效率太低)
方案二:使用意向锁

产生场景:

出现当我们添加行级锁时,Innodb 存储引擎会自动的给这个表添加一个表级别的意向锁
表示该表中存在行级锁。
如果行级锁是共享锁,意向锁也是共享的。行级锁是独占的,意向锁也是独占的

兼容特性:

 
 
意向共享锁
意向独占锁
普通表级共享锁
普通表级独占锁
意向共享锁
兼容
兼容
兼容
不兼容
意向独占锁
兼容
兼容
不兼容
不兼容

解释:

当我们对表中的 行记录 A 添加独占锁 A时,Innodb 会自动给该表添加一个意向独占锁 A
当我们对表中的 行记录 B 添加独占锁  B时,Innodb 会自动给该表添加一个意向独占锁 B
因为是对不同的行记录添加独占锁,所以可以两个行记录锁都会添加成功,
也就说明同时会给表添加两个意向独占锁,所以,意向独占锁可共存

元数据锁:

Innodb 默认是锁是行级锁,但那是对表中数据进行 Insert  Delete  Update  Select  操作时
如果我们要是对整个表的表结构进行变化时,那么我们会为该表添加一个表级锁,就是元数据锁

 

你可能感兴趣的:(MySQL,mysql,数据库,database,sql)