mysql InnoDB 行锁表锁

本文通过实践操作展示了MySQL InnoDB引擎下不同情况下锁的行为差异,包括行锁和表锁的具体应用,验证了索引对锁定类型的影响。

今天大家一起闲聊说道了InnoDB引擎,他们了很多我不知道的事请,不知怎么就料到了锁,这个我还知道一些,就说:在myisam引擎下用到索引的前提下就会加行锁,而且所得是索引表,不用索引的话就加表锁。本来以为很牛,但是同时问我怎么知道的,我说在意片博客上看到的。话刚刚说出口我就觉得一点说服力都没有。然后就说:我好像在mysql的帮助文档上面也看过(其实我没看见过)。老板说:帮助文档也不一定对,版本不一样可能会有修改,还是试一试比较好。

确实,我想了想我所学到的这些只是估计80%都是从网上的博客里看来的,就算是官方文档也可能有版本上的问题而有微小的改变。除了一些代码,像这种知识我确实没有时间过。先买那我就给大家实践一下。

首先需要打开两个mysql的窗口


然后创建一个表 表中有两个字段,其中一个设为索引,另一个不设:


然后加入数据:


下面我们开启事物然后更新大家就能明白了:


然后再在另一个窗口更新


但是呢已经死锁了,跟们没有结果知道我们在第一个窗口commit才可以

然后我们再试试更新其他的选项:


没有问题,所以是行锁,不是表锁。然后我们不用id做条件试试



可见再没有索引的前提下这是表锁,哈哈,虽然很简单,但是我想说的是:估计这是除了代码外的第一次用实践得出来的知识。


### 的区别 MySQL 中的是两种不同的机制,用于控制对数据库的并发访问。它们的主要区别在于的粒度、并发性能以及死风险等方面。 - **粒度**:的粒度较细,只定被访问的具体数据,而不是整个。这意味着多个事务可以同时访问同一张的不同,从而提高了并发性能。相比之下,的粒度较大,定整个,不允许其他事务访问该,直到当前事务释放[^1]。 - **并发性能**:由于允许不同事务访问同一张的不同,因此其并发性能较高。而定期间阻止其他事务访问整个,导致并发性能较低,尤其是在高并发环境下[^1]。 - **死风险**:存在死的风险,因为多个事务可能持有不同的并相互等待对方释放。而不会出现死,因为它定的是整个,其他事务需要等待当前事务释放才能继续执[^1]。 - **加开销**:的管理开销较大,因为它需要在内存中维护每个的信息。而的管理开销较小,因为它只需要维护一个的信息[^4]。 - **适用场景**:适用于高并发、写密集型的应用,如电商、社交、银交易系统等。这些场景通常需要精确修改少量特定的操作。而适用于读多写少、简单查询的场景,例如 MyISAM 和 Memory 引擎等非事务型存储引擎[^3]。 ### 的类型 主要分为共享(Shared Lock)和排他(Exclusive Lock)两种类型。 - **共享**:允许事务读取一数据,其他事务也可以对该加共享,但不能加排他。这确保了多个事务可以同时读取同一数据,但任何事务都不能修改该数据,直到所有共享都被释放[^1]。 - **排他**:允许事务读取和修改一数据,其他事务不能对该加任何类型的。这意味着排他会阻止其他事务对该读取或修改,直到当前事务释放[^1]。 ### 使用场景 - ****:适用于高并发、写密集型的应用,如电商、社交、银交易系统等。典型的例子包括更新用户余额、扣减库存、修改订单状态等。使用 InnoDB 存储引擎的时,是其核心特性。此外,也是实现 REPEATABLE READ 和 SERIALIZABLE 隔离级别的基础。尽管热点可能会成为瓶颈,但允许其他非热点的操作不受影响。 - ****:适用于读多写少、简单查询的场景,例如 MyISAM 和 Memory 引擎等非事务型存储引擎。在这种情况下,可以简化管理,但会降低并发性能[^4]。 ### 示例代码 以下是一个使用的示例: ```sql SELECT * FROM user WHERE id = 1 FOR UPDATE; ``` 这条 SQL 语句会定 `id = 1` 的这一,其他事务对该的访问将被阻塞,直到当前事务释放。 ### 注意事项 - **索引的影响**:MySQL是通过索引加载的,即是是加在索引响应的上的。如果对应的 SQL 语句没有走索引,则会全扫描,将变为。因此,在设计查询时应尽量使用索引,以提高并发性能[^2]。 - **死处理**:在使用时,需要注意死的可能性。当两个事务相互等待对方释放时,会发生死MySQL 提供了死检测机制,会在检测到死时回滚其中一个事务并释放,从而解除死状态[^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值