Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

    • MySQL的权限控制
    • 精细权限管制示例
    • localhost和127.0.0.1的区别-MySQL
    • mysql数据类型
    • 当前读和快照读
    • MySQL中MVCC的实现原理
    • MySQL中MVCC具体用了多少个隐藏字段
    • 锁和事务的关系
    • FOR UPDATE锁类型
  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • MySQL
plantre
2025-05-14

锁和事务的关系

锁与事务的关系详解

锁与事务是数据库并发控制的核心机制,二者共同保障数据的一致性和完整性,但职责不同。以下是两者的关系及相互作用:


  1. 事务的隔离性依赖锁实现
    事务的 隔离性(Isolation)要求并发事务互不干扰,而锁是实现这一特性的核心手段。事务通过锁机制控制对共享数据的访问权限,防止脏读、不可重复读和幻读问题。
    • 共享锁(S锁):允许多事务同时读取同一数据,但禁止写入(如 SELECT ... LOCK IN SHARE MODE)。

• 排他锁(X锁):仅允许持有锁的事务读写数据(如 SELECT ... FOR UPDATE),其他事务无法访问。

• 间隙锁(Gap Lock):在可重复读隔离级别中,锁定数据间的间隙,防止幻读。


  1. 事务隔离级别决定锁的策略
    不同的事务隔离级别对应不同的锁机制:
    • 读未提交(Read Uncommitted):不加锁,允许读取未提交数据,存在脏读风险。

• 读已提交(Read Committed):使用行级锁,每次查询前释放锁,可能导致不可重复读。

• 可重复读(Repeatable Read):事务持有行锁至提交,结合间隙锁解决幻读(InnoDB默认级别)。

• 串行化(Serializable):表级锁或严格的行锁,完全串行执行,牺牲并发性。


  1. 事务生命周期管理锁的获取与释放
    • 自动锁:事务在执行操作时隐式获取锁(如DML语句自动加行锁),提交或回滚后释放。

• 显式锁:通过SQL指令手动加锁(如 FOR UPDATE),适用于需要强制控制并发场景。

• MVCC(多版本并发控制):InnoDB通过版本链实现非锁定读,仅在写操作时加锁,平衡性能与一致性。


  1. 锁冲突与事务并发控制
    • 锁粒度:行锁(InnoDB)支持高并发,表锁(MyISAM)简单但并发度低。

• 死锁:多个事务互相等待锁释放时发生,数据库通过超时或死锁检测(如InnoDB的等待图算法)自动回滚事务。

• 优化建议:

• 缩短事务持有锁的时间,避免长事务;

• 按固定顺序访问资源,减少死锁概率;

• 合理选择隔离级别(如非必要不使用串行化)。


  1. 事务的原子性与锁的协作
    事务的 原子性(Atomicity)要求操作要么全部成功,要么全部回滚。锁在此过程中确保:
    • 事务提交前,其他事务无法看到中间状态;

• 事务回滚时,锁释放并撤销所有修改,恢复数据一致性。


总结
锁是事务实现隔离性和一致性的工具,事务通过锁机制协调并发访问。不同的隔离级别对应不同的锁策略,而锁的粒度、类型和持有时间直接影响并发性能。合理设计事务和锁的使用,是平衡数据安全与系统效率的关键。

编辑 (opens new window)
上次更新: 2025/06/13, 00:51:28
MySQL中MVCC具体用了多少个隐藏字段
FOR UPDATE锁类型

← MySQL中MVCC具体用了多少个隐藏字段 FOR UPDATE锁类型→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式