MySQL 锁分类

MySQL 锁分类

在 MySQL 中,为了保证并发性能和数据安全,有多种锁机制。以下是对各类锁整理归纳

表级锁

表级锁是对整张表进行锁定。

表数据锁

1. 读锁

允许多个会话同时读取同一张表的数据,但不允许其他会话对该表进行写操作。

例如: 多个用户可以同时查看同一份订单表,但任何用户都无法在查看时修改订单数据。

2. 写锁

只允许一个会话对表进行写操作,其他会话无法读取或写入该表。

例如: 当一个用户在对订单表进行结算操作时,其他用户无法同时对订单表进行任何操作,直到结算完成。

3. 意向锁

意向锁是一个标识位,用来表示某个事务对表中某一区域(如行或表)的意图进行锁定。当有其他事务要对表进行加锁时,不需要遍历整张表,只需检查意向锁的存在即可。

表结构锁

元数据锁(MDL)

MySQL 默认开启元数据锁,用来保护表结构的并发修改。当有线程修改表结构时,会进行加锁操作,防止其他线程同时修改表结构。

例如: 当一个用户在对表添加新列时,其他用户无法同时修改表的其他结构,以确保表结构修改的安全性。

行级锁

行级锁允许同时操作表中的多行数据,提高了并发处理能力。

1. 共享锁(S 锁)

共享锁用于读取操作,多个线程可以同时持有共享锁,但阻止其他线程获取排他锁,保证数据读取的一致性。

例如: 多个用户可以同时读取订单表中的订单信息,但不允许任何用户在读取时修改订单数据。

2. 排他锁(X 锁)

排他锁用于写入操作,只允许一个线程持有排他锁,其他线程无法同时持有共享锁或排他锁,保证数据的独占性。

例如: 当一个用户在对订单表中的订单进行修改时,其他用户无法同时读取或修改同一订单数据,直到修改完成。

特殊行锁

1. 间隙锁

间隙锁用于锁定数据索引之间的间隙,防止其他事务在间隙内插入新数据,保证查询结果的一致性。它只影响索引间隙,而不锁定已有数据行。

例如: 当一个事务使用范围查询锁定某些订单号的索引间隙时,其他事务无法在这些订单号的索引间隙内插入新订单。

2. 临键锁

临界锁是行锁和间隙锁的结合体,既锁定特定行数据,也锁定其索引间隙,确保在操作过程中数据的完整性和一致性。

例如: 当一个事务锁定了某个订单的具体行数据及其订单号的索引间隙时,确保其他事务无法同时插入新订单或修改现有订单。

如何更安全的为表更新表结构?

当一个生产环境表需要更新表结构时,会引起MDL(元数据)锁,若此表有大量业务查询,将会影响其他业务使用,长时间等待连接阻塞,可以使用为更新表结构语句设置等待时间方式,阻塞时间过长则放弃,人为更新其结构,避免过度影响线上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值