MYSQL锁

本文介绍了数据库锁的概念及其重要性,特别是MySQL中的MyISAM和InnoDB存储引擎的锁机制。MyISAM支持表级锁,适合并发性不高、查询为主的场景,而InnoDB则支持行级锁,提供更高的并发度,适用于事务完整性要求高的系统。此外,还提及了悲观锁和乐观锁的原理。

1.锁的定义

我们在操作数据库的时候,可能会由于并发问题而引起数据的不一致(数据冲突),锁的冲突也是影响数据库并发访问性能的一个重要因素,锁对于数据库而言就显得尤其重要
MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
比如:
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);
innoDB存储引擎即支持行级锁(row-level locking),也支持表级锁,默认情况下是采用行级锁

表级锁:
开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定力度大,发生锁冲突的概率最高,并发度最低。
应用场景:并发性不高,以查询为主,少量更新的应用,比如小型的web应用
行级锁:
开销大,加锁慢;会出现死锁;锁定力度最小,发生锁冲突的概率最低,并发度也最高。
应用场景:适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统
页锁:
开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定力度介于表锁和行锁之间,并发度一般

其他
悲观锁和乐观锁
悲观锁
就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都 会上锁
乐观锁
就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
共享锁
共享锁指的就是对于多个不同的事务,对同一个资源共享同一个锁。相当于对于同一扇门,它拥有多个钥
匙一样,共享锁在mysql中是通过 什么命令来调用呢。在执行语句后面加上lock in share mode就代表对某些资源加上共享锁了。

2.MYISAM引擎

表锁有两种模式:表共享锁(Table Read Lock) 和表独占写锁(Table Write Lock).
1.对MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;
2.对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;
3.MyISAM表的读操作和写操作之间,以及写操作之间是串行的。

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

3.INNODB引擎

innoDB的行锁模式及加锁方法
innoDB有两种类型的行锁
1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集得排他锁。
2.排他锁(X):允许获取排他锁得事务更新数据,阻止其他事务取得相同得数据集共享读锁和排他写锁。

另外,为了允许行锁和表锁共存,实现多颗粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁
1.意向共享锁(IS):事务打算给数据行共享锁,事务在给一个数据行加共享锁必须先取得该表的IS锁。
2.意向排他锁(IX):事务打算给数据行加排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

### MySQL 机制详解 MySQL 中的机制是为了保障数据库在高并发环境下的数据一致性和稳定性而设计的重要功能之一。以下是关于 MySQL 机制的具体解析: #### 1. 的分类 MySQL 主要分为两种类型的:表级和行级。 - **表级 (Table-Level Lock)** 表级是最简单的定策略,适用于 MyISAM 存储引擎。它会在整个表上施加,无论是读操作还是写操作都会影响到整张表。对于 `SELECT` 操作,MyISAM 会自动给涉及的所有表加上读;而对于 `UPDATE`, `INSERT`, 和 `DELETE` 则会自动加上写[^3]。 - **行级 (Row-Level Lock)** 行级由 InnoDB 存储引擎实现,提供更高的并发能力。只有涉及到具体记录的操作才会触发行级。例如,在执行 `SELECT ... FOR UPDATE` 或者 `SELECT ... LOCK IN SHARE MODE` 时,InnoDB 只会对符合条件的特定行加而不是封整个表[^2]。 #### 2. 不同存储引擎的特性 不同的存储引擎有不同的行为: - **MyISAM**: 默认使用的是表级别的,这意味着即使是一个小范围内的更新也会阻塞其他线程对该表任何部分的访问[^3]。 - **InnoDB**: 支持事务以及更细粒度的行级,这使得它可以更好地处理复杂的多用户场景下的并发请求[^4]。 #### 3. 常见类型及其作用 除了基本的表级与行级区分外,还有几种具体的形式用于满足不同需求: - **共享 (Shared Lock, S-Lock)** 当一个客户端通过命令如 `LOCK TABLES table_name READ` 获取了一个表上的共享之后,其它客户也可以获得该表上的共享,但不能再获取排他直到当前持有共享的所有连接释放它们为止[^2]。 - **排他 (Exclusive Lock, X-Lock)** 排他允许独占式的修改权限。如果某个事务已经获得了某条记录或者某些列上的排他,则在此期间不允许别的事务再对此同一组资源申请任何形式的新——既包括另外的排他也包括新的共享[^2]。 - **GAP ** 这种特殊的用来阻止新纪录插入到现有两条连续记录之间的空隙(gap)里去。比如当我们运行下面这条SQL语句的时候就会用到gap lock:`SELECT * FROM table_name WHERE id > 10 FOR UPDATE;` - **Next-Key Lock** 是一种组合了索引记录本身(record)和其前面那个区间(gap)两者一起保护起来的一种复合型模式。主要用于解决可重复读(repeatable read)隔离级别下可能出现的幻影问题(phantom problem)[^4]。 #### 4. 死现象及预防措施 死是指两个或更多事务相互等待对方持有的资源从而进入僵局的状态。为避免这种情况发生可以采取以下方法: - 尽量按照固定的顺序访问资源; - 减少单次事务持续时间; - 设置合理的超时参数让系统能够及时发现并终止潜在的死循环状况等等[^4]。 ```sql -- 示例:如何手动解表 UNLOCK TABLES; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值