行锁

简介: 行锁是数据库并发控制机制,通过锁定特定行记录,实现多事务并行操作,提升性能。支持共享锁与排他锁,适用于电商、金融等高并发场景,需注意死锁预防与索引优化。

行锁(Row Lock)是数据库中用于实现并发控制的一种锁机制,它锁定表中的特定行记录,允许不同事务同时操作不同行的数据,从而提高并发性能。行锁主要用于解决脏读、不可重复读和幻读等数据一致性问题。

核心原理

  1. 锁定粒度

    • 仅对需要操作的行记录加锁,不影响其他行的读写。
    • 例如:
      UPDATE users SET balance = balance - 100 WHERE id = 1;  -- 仅锁定id=1的行
      
  2. 锁的类型

    • 共享锁(Shared Lock):允许多事务同时读取同一行,阻止其他事务获取排他锁。
    • 排他锁(Exclusive Lock):阻止其他事务获取共享锁或排他锁,用于写操作。

行锁的优缺点

  • 优点

    • 高并发支持:不同事务可同时操作不同行,提升吞吐量。
    • 数据一致性:保护单行数据,避免脏写和更新丢失。
  • 缺点

    • 锁冲突:若频繁操作同一行,会导致锁等待和性能下降。
    • 死锁风险:多事务循环等待行锁时可能产生死锁。

实现方式

1. 数据库层面

  • MySQL InnoDB

    SELECT * FROM users WHERE id = 1 FOR UPDATE;  -- 显式获取排他锁
    
    • 隐式加锁:UPDATEDELETE语句自动对操作的行加排他锁。
  • Oracle

    SELECT * FROM users WHERE id = 1 FOR UPDATE;  -- 显式获取排他锁
    

2. 应用层面

  • 通过数据库连接池配置隔离级别,间接控制行锁行为。
  • 例如,设置隔离级别为可重复读(REPEATABLE READ)
    connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
    

行锁的典型应用场景

  1. 高并发事务处理

    • 如电商库存扣减、金融账户转账。
  2. 数据敏感操作

    • 对特定行数据的修改需要严格的原子性。
  3. 长事务

    • 事务执行期间需保持数据一致性。

与其他锁的对比

锁类型 锁定粒度 并发度 性能 典型场景
行锁 单行记录 高并发事务
表锁 整张表 批量操作(如TRUNCATE)
页锁 数据页(多个行) 中等 中等 索引操作
间隙锁 索引间隙 较差 防止幻读

注意事项

  1. 死锁预防

    • 按相同顺序访问行,如按主键升序。
    • 设置锁超时时间:
      SET innodb_lock_wait_timeout = 5;  -- MySQL设置锁等待超时5秒
      
  2. 索引优化

    • 必须通过索引条件访问行,否则可能升级为表锁。
    • 错误示例(全表扫描):
      UPDATE users SET status = 'active' WHERE name LIKE '%test%';  -- 无索引,可能锁全表
      
  3. 事务隔离级别

    • 不同隔离级别对行锁的使用方式不同:
      • 读未提交(READ UNCOMMITTED):不使用行锁。
      • 读已提交(READ COMMITTED):仅锁定当前读取的行。
      • 可重复读(REPEATABLE READ):可能使用间隙锁,防止幻读。

行锁性能优化

  1. 减少锁持有时间

    • 避免在事务中执行耗时操作(如IO、远程调用)。
  2. 批量操作分批次

    • 避免一次性锁定大量行:

      -- 错误:一次性更新全量数据
      UPDATE users SET last_login = NOW();
      
      -- 正确:分批更新
      UPDATE users SET last_login = NOW() WHERE id BETWEEN 1 AND 1000;
      UPDATE users SET last_login = NOW() WHERE id BETWEEN 1001 AND 2000;
      
  3. 使用乐观锁

    • 对于读多写少场景,通过版本号机制减少行锁使用:
      UPDATE users SET balance = balance - 100, version = version + 1 
      WHERE id = 1 AND version = 5;  -- 版本号验证
      

总结

行锁是数据库实现高并发事务的关键机制,通过锁定特定行记录平衡了数据一致性和性能。合理使用行锁需注意索引优化、事务隔离级别和死锁预防。在高并发系统中,行锁的优化直接影响整体吞吐量,需结合业务场景选择合适的锁策略。

目录
相关文章
|
设计模式 负载均衡 Nacos
远程调用 OpenFeign 底层原理解析
Feign 是Springcloud 提供一个声明式的伪Http客户端 它使得调用远程服务就像调用本地服务一样简单 只需要创建一个接口 并且添加注解就可以 Nacos 很好的兼容Feign Feign 默认集成了Ribbon 所以在Nacos 下使用Fegin 默认就实现了负载均衡的效果
2578 1
远程调用 OpenFeign 底层原理解析
|
机器学习/深度学习 人工智能 算法
《AI芯片:如何让硬件与AI计算需求完美契合》
在人工智能快速发展的今天,AI芯片成为推动该领域前行的关键力量。AI芯片如同“超级大脑”,支撑着从智能语音助手到自动驾驶汽车等各种复杂应用。它通过GPU、ASIC和FPGA等架构,优化矩阵运算、内存管理和数据传输,满足大规模数据处理需求。尽管面临通用性和成本挑战,未来AI芯片有望在异构计算、新兴技术和降低成本方面取得突破,为AI发展注入强大动力。
908 17
|
8月前
|
NoSQL Redis 数据库
为什么 Lua 脚本可以保证原子性?
Redis中的原子性包含两层含义:并发编程中的“操作不可中断”与数据库ACID中的“全执行或全回滚”。Lua脚本在Redis中以单线程整体执行,保证了前者,但出错不回滚,故不满足后者。需明确讨论的是哪种原子性。
376 0
|
9月前
|
存储 缓存 算法
哈希表核心原理 哈希表等于Map吗?
哈希表不等于Map。Map是键值映射的接口,哈希表(如HashMap)是其一种实现。增删查改O(1)的前提是哈希函数高效且冲突处理得当。本文详解哈希表原理、哈希冲突解决、负载因子与key不可变性,助你深入理解底层机制。
|
人工智能 自然语言处理 API
AI大模型 智能AI开源模型与大模型接口整理(8个开源模型+7个大模型接口)
AI大模型 智能AI开源模型与大模型接口整理(8个开源模型+7个大模型接口)
3905 5
|
存储 Java 对象存储
轻量级锁
轻量级锁是JVM为提升多线程性能而引入的锁机制,通过CAS操作减少线程阻塞,适用于同步块执行时间短且线程竞争不激烈的场景。其核心在于使用栈帧中的锁记录与CAS操作实现高效加锁,避免用户态与内核态切换带来的性能损耗。当无竞争时,仅需一次CAS即可完成锁获取;若竞争激烈,则可能升级为重量级锁。相比偏向锁和重量级锁,轻量级锁在低竞争环境下具有更高的效率。
414 0
|
机器学习/深度学习 人工智能 并行计算
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat 是一款革命性的平台,专为简化和加速类ChatGPT模型的训练而设计。通过一键式脚本,用户可以轻松完成从预训练模型到生成自定义ChatGPT模型的全过程。该系统复刻了InstructGPT的RLHF训练方法,并集成了一系列优化技术,如DeepSpeed Hybrid Engine,大幅提升了训练效率和经济性。使用DeepSpeed Chat,即使是拥有数千亿参数的大模型,也能在短时间内完成训练,且成本显著降低。无论是单GPU还是多GPU集群环境,DeepSpeed Chat都能提供卓越的性能和易用性,让RLHF训练变得更加普及。
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
|
机器学习/深度学习 异构计算
【MATLAB第55期】#源码分享| 基于MATLAB的LSTM长短期记忆网络的一列数据时间序列预测模型
创建LSTM回归网络。将LSTM层指定为具有128个隐藏单元。训练参数可查看帮助,明白其中含义。% 定义网络结构% 定义训练参数。
Vue3通知提醒(Notification)
这是一个基于 Vue2 的通知提醒框组件,支持高度自定义设置,包括消息标题、自动关闭延时、弹出位置等。提供了五种样式:默认、信息、成功、警告和错误,并可通过不同方法调用以实现相应样式。组件还支持多种位置设置,如顶部左侧、顶部右侧、底部左侧和底部右侧,并允许调整与屏幕边缘的距离。
1127 3
Vue3通知提醒(Notification)
|
存储 NoSQL 应用服务中间件
Redis 学习笔记
本文详细介绍了Redis的基本概念、特性、应用场景,并提供了在Centos下安装Redis5的步骤,以及如何使用Redis客户端和命令进行数据类型操作和管理。
966 2