【MySQL锁之】MyISAM存储引擎及其锁机制

本文详细介绍了MyISAM存储引擎的表级锁机制,包括表共享读锁和表独占写锁的概念、工作原理以及如何在实际应用中使用这些锁机制。重点阐述了MyISAM表的读写操作之间的串行性,以及在并发插入方面的特殊处理方式,通过系统变量concurrent_insert来控制其并发插入行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql的锁机制是不同的存储引擎支持不同的锁机制。本文要讲的MyISAM存储引擎的锁机制就是表级锁(table-level locking).顾名思义,表级锁就是锁住整个表。

表级锁有两种模式:表共享读锁和表独占写锁。


由上表可见,MyISAM表的读操作,不会阻塞其他用户的读操作,但是会阻塞写操作。

MyISAM表的写操作,会阻塞其他用户的读和写操作。

MyISAM表的读操作和写操作之间是串行的。


当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读,写操作都会等待,直到锁被释放为止。



如何加表锁?

MyISAM在执行查询语句(select)前,会自动给涉及的所有表都加上读锁,在执行更新操作(update ,insert ,delete)前,都会自动给涉及的表加写锁,这个过程不需要用户干预,因此,用户一般不需要直接用lock table 命令给Myisam表显示加锁。


给myisam显示加锁一般是为了模拟事务操作,实现对某一时间点多个表的一致性读取。

在用Lock tables 给表显示加表锁时,必须同时取得所有涉及表的锁,并且mysql不支持表升级,也就是说,在执行lock tables后,只能访问显示加锁的表,不能访问未加锁的表,同时,如果加的是读锁,那么只能执行查询操作,而不能执行更新操作。在自动加锁的情况下也是如此,myisam总是一次获得sql语句所需要的全部锁,这也正是myisam表不会出现死锁的原因。




并发插入

前面说了MyISAM表的读和写时串行的,但这是就总体而言的。在一定条件下,MyISAM表也支持查询和插入操作的并发进行。

MyISAM存储引擎有个系统变量concurrent_insert,专门控制其并发插入的行为。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值