Mysql锁及适用场景

一、mysql中的锁有哪些?

1.1 锁的类型

(1)共享锁(Shared Lock): 共享锁允许事务读取数据,但不允许其他事务修改数据。多个事务可以同时持有共享锁。

-- 事务A获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;

-- 事务B也可以获取共享锁
START TRANSACTION;
SELECT * FROM table_name WHERE column_name = 'value' LOCK IN SHARE MODE;

(2)排他锁(Exclusive Lock): 排他锁用于写操作,只有一个事务能持有排他锁,其他事务无法同时持有共享锁或排他锁。

-- 事务A获取排他锁
START TRANSACTION;
UPDATE table_name SET column_name = 'new_value' WHERE id = 1 FOR UPDATE;

-- 事务B无法获取排他锁,需等待事务A释放锁
START TRANSACTION;
UPDATE table_name SET column_name = 'another_value' WHERE id = 1 FOR UPDATE;

1.2 锁的级别

(1)行级锁(Row Lock): 行级锁针对数据表中的行进行加锁,可以减少并发操作产生的锁冲突。

-- 事务A获取行级锁
START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

-- 事务B也可以获取行级锁,但针对不同行
START TRANSACTION;
SELECT * FROM table_name WHERE id = 2 FOR UPDATE;

(2)表级锁(Table Lock): 表级锁对整个表进行加锁,会限制其他事务对表的操作。

-- 事务A获取表级锁
LOCK TABLES table_name WRITE;

-- 事务B无法同时获取表级锁,需等待事务A释放锁
LOCK TABLES table_name READ;

二、哪些实际业务场景下,我们会在代码中用到mysql的锁?

  1. 简单事务控制: 对于一些简单的事务控制场景,例如在单个数据库事务中需要确保某些数据的完整性和一致性时,可以直接在 SQL 中增加排他锁来实现。这样做既简单又直接,避免引入额外的复杂性。

  2. 低并发情况: 如果业务场景下并发访问量不高,或者不需要跨服务或跨实例进行加锁操作,直接在 SQL 中增加排他锁可能会更加轻量和直观,不需要引入额外的分布式系统组件。

  3. 数据库专用功能: 有些数据库系统提供了特定的排他锁机制,并且对于特定的业务场景,这些数据库专用的排他锁功能可能更加适用和高效。

  4. 特定的数据操作: 在某些需要对整个表或某些数据范围进行原子操作的情况下,直接在 SQL 中增加排他锁可能更加方便和可行,特别是针对较小规模的数据操作。

三、实际的业务场景是在电商系统中处理订单库存扣减操作。当多个用户同时下单购买同一商品时,需要确保库存扣减的原子性和数据的一致性。适合用Mysql的锁还是Redis加分布式锁,为什么?

在实际订单库存扣减的业务场景中,使用分布式锁(如 Redis 分布式锁)比直接在 SQL 中增加排他锁更好的主要原因有以下几点:

  1. 跨服务支持: 如果订单库存扣减的业务涉及到多个服务或多个实例,使用分布式锁可以跨服务地实现对共享资源(库存数据)的加锁操作,确保不同服务之间的并发访问问题。

  2. 细粒度控制: 分布式锁可以实现更细粒度的控制,例如针对每个商品ID进行加锁,而不是一次性锁住整个表或某个范围的数据,从而提高并发性能。

  3. 避免数据库负担: 直接在 SQL 中增加排他锁可能会给数据库带来额外的负担,特别是在高并发的情况下,容易造成数据库性能瓶颈。通过采用分布式锁,可以将部分锁操作转移到 Redis 等缓存中,减轻数据库压力。

  4. 灵活性和可扩展性: 使用分布式锁可以更灵活地控制锁的获取和释放逻辑,同时也更容易实现锁的超时、自动续期等功能,满足不同业务场景的需求。此外,分布式锁的架构也更具扩展性,便于水平扩展和集群部署。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中存在三种级别的:行级、表级和页级。 1. 行级MySQL的默认隔离级别是可重复读,支持行级。行级是最细粒度的,它可以在数据库中的单个行上进行操作。当一个事务占用了某行的行级时,其他事务无法修改该行。这提供了更好的并发性能,但也可能导致冲突和死。 2. 表级:表级是最粗粒度的,它可以在整个表上进行操作。当一个事务占用了某个表的表级时,其他事务无法修改该表中的任何数据。表级适用于只读操作或对整个表进行修改的情况,但会限制并发性能。 3. 页级:页级介于行级和表级之间,它以页为单位进行定。一个页通常包含多行数据。当一个事务占用了某页的页级时,其他事务无法修改该页中的任何数据。页级在某些情况下可以提供更好的并发性能,但在高并发环境下可能导致冲突。 选择何种取决于具体的业务需求和并发访问模式。通常情况下,行级是最常用的级别,可以提供较好的并发性能和数据完整性。如果只涉及到只读操作或对整个表进行修改,可以考虑使用表级。而页级在某些特定场景下可能有一定的应用价值。 需要注意的是,的使用需要谨慎,合理选择级别以避免死冲突和性能问题。另外,MySQL还支持其他类型的,如意向和自适应等,在实际使用中需要根据具体情况进行选择和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值