数据库锁机制

数据库锁机制

  1. MySQL 中的锁机制

    • 共享锁(S 锁)和排他锁(X 锁)

      • 在 MySQL 中,基于事务的隔离级别来实现锁机制。共享锁允许同时有多个事务读取同一数据,但不允许其他事务对该数据进行写操作。排他锁则在事务对数据进行写操作时使用,此时其他事务既不能读取也不能写入该数据。

      • 例如,在一个事务中使用SELECT... LOCK IN SHARE MODE语句可以对查询的数据添加共享锁。如果另一个事务也想对同一数据添加排他锁,就会被阻塞,直到共享锁释放。而SELECT... FOR UPDATE语句则会对查询的数据添加排他锁。

    • 行级锁、表级锁和页级锁

      • 行级锁:MySQL 的 InnoDB 存储引擎支持行级锁,这是一种细粒度的锁。它可以对表中的单行数据进行锁定,这样在多用户并发访问时,不同的事务可以同时操作不同行的数据,大大提高了并发性能。例如,当两个用户同时更新一个表中的不同行记录时,InnoDB 可以通过行级锁允许这两个操作同时进行,而不会相互干扰。

      • 表级锁:MyISAM 存储引擎主要使用表级锁,这种锁的粒度比较粗。当一个事务对表进行操作时,会锁定整个表。例如,在一个事务对 MyISAM 表进行写操作时,其他事务无论是读还是写该表都需要等待锁的释放。虽然表级锁并发性能相对较差,但在某些特定的场景下(如批量操作)可能更高效。

      • 页级锁:介于行级锁和表级锁之间,它锁定的是数据页(一个数据页包含多行数据)。这种锁在实际应用中相对较少,主要是为了平衡行级锁的高并发和表级锁的低开销,但它的实现和管理相对复杂。

    • 意向锁

      • 在 InnoDB 中,还有意向锁的概念。当一个事务在表中的某一行添加行级锁时,会自动在表级添加意向锁。意向锁主要是为了在事务处理过程中,让更高层次(如数据库引擎)快速了解表中是否有行级锁存在。例如,有事务对表中的某几行添加了排他行级锁,此时会在表级添加意向排他锁。当另一个事务想要对整个表添加表级锁时,通过检查意向锁就可以知道表中有行级锁,从而避免冲突。
  2. 其他数据库的锁机制示例(以 Oracle 为例)

    • 行排他锁(RX)和共享行排他锁(SRX)

      • Oracle 也有类似的锁机制。行排他锁可以防止其他事务对同一行进行读写操作,而共享行排他锁允许其他事务对同一行进行读操作,但不能进行写操作。

      • 例如,在 Oracle 中可以使用SELECT... FOR UPDATE语句来添加行排他锁,确保事务在更新数据时的独占性。

    • 自动锁升级和降级

      • Oracle 数据库有自动锁升级和降级的机制。当一个事务对大量行进行操作时,可能会从行级锁自动升级为表级锁,以减少锁管理的开销。相反,当事务的操作范围缩小,也可能会自动从表级锁降级为行级锁,提高并发性能。这种自动机制可以根据数据库的实际运行情况灵活调整锁的粒度。
  3. 数据库层面实现锁机制的一般步骤

    • 事务开始:当一个事务开始时,数据库会根据事务的操作类型和隔离级别来确定是否需要加锁以及加何种锁。

    • 锁获取:如果需要锁,事务会尝试获取相应的锁。如果锁已经被其他事务占用,根据数据库的锁等待策略,事务可能会等待一段时间或者直接返回错误。

    • 数据操作:在获取锁之后,事务可以对锁定的数据进行读取或写入操作。

    • 锁释放:当事务完成操作或者回滚时,会释放之前获取的锁,使其他事务能够访问相应的数据。

相关推荐
头发还在的女程序员9 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats9 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我1234510 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
暖和_白开水11 小时前
数据分析agent(十三_3):docker mysql容器镜像服务的异常错误
mysql·docker·容器
都叫我大帅哥12 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.12 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔14 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊14 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
ttwuai14 小时前
AI 生成后台改数据后,操作日志别只记按钮:Go + MySQL 怎么验
数据库·人工智能·mysql·golang
韩楚风15 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian