博客
关于我
select......for update会锁表还是锁行?
阅读量:796 次
发布时间:2023-03-22

本文共 892 字,大约阅读时间需要 2 分钟。

数据库锁机制是数据库管理系统(DBMS)中用来保证数据一致性的重要机制。在数据库操作中,SELECT ... FOR UPDATE 语句被广泛使用,但其加锁机制和锁的类型(行锁或表锁)常常让开发者感到困惑。

锁的类型与条件

SELECT ... FOR UPDATE 语句的核心作用是加锁。当使用该语句查询时,除了获得查询结果外,还会加锁。锁的类型取决于查询条件是否使用了索引或主键:

  • 索引/主键条件

    如果查询条件基于主键或索引(如WHERE id = 1),则SELECT ... FOR UPDATE 会对相关行数据加行锁。

  • 普通字段条件

    如果查询条件基于普通字段(没有索引或主键,如WHERE code = 'abc'),则SELECT ... FOR UPDATE 会对整个表加表锁。

  • 例子解析

    以下几个例子帮助理解上述机制:

    实例1:主键查询与行锁

    • 第一个事务:执行SELECT * FROM user WHERE id = 1 FOR UPDATE,加锁id=1的行。
    • 第二个事务:尝试更新id=1的数据,会被阻塞直到第一个事务提交。

    实例2:普通字段查询与表锁

    • 第一个事务:执行SELECT * FROM user WHERE code = 'abc' FOR UPDATE,整个user表被加锁。
    • 第二个事务:尝试更新code = 'def',由于表被锁,操作失败。

    实例3:索引优化与行锁

    • 表建表语句CREATE TABLE user (...) ENGINE = INNODB,且age字段有唯一索引。
    • 查询条件WHERE age = 30 FOR UPDATE,加锁行数据。

    实例4:字段缺少索引与表锁

    • 查询条件WHERE code = 'xyz' FOR UPDATE,由于code无索引,整个表被加锁。

    优化建议

  • 索引优化:在查询条件字段上增加索引,避免表锁。
  • 并发控制:合理设计事务并发控制,避免死锁。
  • 锁定策略:根据业务需求选择适当的锁定策略,提升系统性能。
  • 希望以上内容对您理解数据库锁机制有所帮助。如果需要进一步探讨架构或源码,请随时联系。

    转载地址:http://bsqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现程序暂停(附完整源码)
    查看>>
    Objective-C实现程序等待一段时间(附完整源码)
    查看>>
    Objective-C实现程序自动更新(附完整源码)
    查看>>