• InnoDB中外键与锁


    环境:MySQL 5.7.26

    外键主要用于引用完整性的约束检查。在InnoDB中,对于一个外键列,如果没有显式地对这个列加索引, 引擎会自动对其加一个索引。

    外键的插入或更新,首先需要查询父表中的记录,即select父表,对于父表的select操作,不是使用一致性非锁定读的方式,因为这样会发生数据不一致的问题。因此使用的是 select ... lock in share mode 方式,会主动对父表加一个 S 锁。

    表与数据

    1. create table a
    2. (
    3. id int auto_increment
    4. primary key,
    5. name varchar(64) null,
    6. age int null,
    7. b_id int null,
    8. constraint a_b_id_fk
    9. foreign key (b_id) references b (id)
    10. );
    11. [
    12. {
    13. "id": 3,
    14. "name": "hua",
    15. "age": 30,
    16. "b_id": 3
    17. }
    18. ]
    19. create table b
    20. (
    21. id int auto_increment
    22. primary key,
    23. name varchar(64) null,
    24. time bigint null
    25. );
    26. [
    27. {
    28. "id": 4,
    29. "name": "t",
    30. "time": 224
    31. }
    32. ]

    事务执行流程

    事务1 trx_id:56475

    事务2 trx_id:56476

    步骤

    select * from b where id=4 for update

    update a set b_id=4 where id=3

    查看事务与锁

    1. [
    2. {
    3. "trx_id": "56476",
    4. "trx_state": "LOCK WAIT",
    5. "trx_started": "2022-08-22 09:51:34",
    6. "trx_requested_lock_id": "56476:226:3:5",
    7. "trx_wait_started": "2022-08-22 09:51:34",
    8. "trx_weight": 5,
    9. "trx_mysql_thread_id": 37,
    10. "trx_query": "/* ApplicationName=DataGrip 2022.2 */ update a set b_id=4 where id=3",
    11. "trx_operation_state": "updating or deleting",
    12. "trx_tables_in_use": 1,
    13. "trx_tables_locked": 2,
    14. "trx_lock_structs": 4,
    15. "trx_lock_memory_bytes": 1136,
    16. "trx_rows_locked": 2,
    17. "trx_rows_modified": 1,
    18. "trx_concurrency_tickets": 0,
    19. "trx_isolation_level": "REPEATABLE READ",
    20. "trx_unique_checks": 1,
    21. "trx_foreign_key_checks": 1,
    22. "trx_last_foreign_key_error": null,
    23. "trx_adaptive_hash_latched": 0,
    24. "trx_adaptive_hash_timeout": 0,
    25. "trx_is_read_only": 0,
    26. "trx_autocommit_non_locking": 0,
    27. "lock_id": "56476:226:3:5",
    28. "lock_trx_id": "56476",
    29. "lock_mode": "S",
    30. "lock_type": "RECORD",
    31. "lock_table": "`dps`.`b`",
    32. "lock_index": "PRIMARY",
    33. "lock_space": 226,
    34. "lock_page": 3,
    35. "lock_rec": 5,
    36. "lock_data": "4"
    37. },
    38. {
    39. "trx_id": "56475",
    40. "trx_state": "RUNNING",
    41. "trx_started": "2022-08-22 09:51:31",
    42. "trx_requested_lock_id": null,
    43. "trx_wait_started": null,
    44. "trx_weight": 2,
    45. "trx_mysql_thread_id": 36,
    46. "trx_query": null,
    47. "trx_operation_state": null,
    48. "trx_tables_in_use": 0,
    49. "trx_tables_locked": 1,
    50. "trx_lock_structs": 2,
    51. "trx_lock_memory_bytes": 1136,
    52. "trx_rows_locked": 1,
    53. "trx_rows_modified": 0,
    54. "trx_concurrency_tickets": 0,
    55. "trx_isolation_level": "REPEATABLE READ",
    56. "trx_unique_checks": 1,
    57. "trx_foreign_key_checks": 1,
    58. "trx_last_foreign_key_error": null,
    59. "trx_adaptive_hash_latched": 0,
    60. "trx_adaptive_hash_timeout": 0,
    61. "trx_is_read_only": 0,
    62. "trx_autocommit_non_locking": 0,
    63. "lock_id": "56475:226:3:5",
    64. "lock_trx_id": "56475",
    65. "lock_mode": "X",
    66. "lock_type": "RECORD",
    67. "lock_table": "`dps`.`b`",
    68. "lock_index": "PRIMARY",
    69. "lock_space": 226,
    70. "lock_page": 3,
    71. "lock_rec": 5,
    72. "lock_data": "4"
    73. }
    74. ]

    分析

    事务1 执行 select * from b where id=4 for update 对b中的id=4的行添加 X 锁

    事务2 执行 update a set b_id=4 where id=3, 更新 a 中 id=3 的外键数据时,需要对 b 中 id=4 的行添加 S 锁,此时会阻塞。从上面的数据可以看到 事务2 中的锁为 共享锁(S)。

    "lock_mode": "S"

    如果将事务1中的语句改为select * from b where id=4 lock in share mode,则事务2 中的语句不会阻塞。

  • 相关阅读:
    网课题库接口API—小白专用
    在DOS或Windows环境中,使用工具Debug
    DeeTune:基于 eBPF 的百度网络框架设计与应用
    一个混乱千万级软件项目
    八、【React-Router5】路由组件传参
    MySQL数据库的简介及select语句的执行流程
    设计模式--组合模式(Composite Pattern)
    Android studio在Ubuntu桌面上 创建桌面图标,以及导航栏图标
    2023年十款开源测试开发工具推荐(自动化、性能、造数据、流量复制)
    【笔记】Ningx(9)HTTPS
  • 原文地址:https://blog.csdn.net/CaptHua/article/details/126460965