Skip to content

Commit 2d333d3

Browse files
authored
master: document tidb_foreign_key_check_in_shared_lock (#21359)
1 parent 8f831ff commit 2d333d3

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

foreign-key.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,11 @@ TiDB 支持是否开启外键约束检查,由系统变量 [`foreign_key_checks
177177

178178
##
179179

180-
`INSERT` 或者 `UPDATE` 子表时,外键约束会检查父表中是否存在对应的外键值,并对父表中的该行数据上锁,避免该外键值被其他操作删除,导致破坏外键约束。这里的上锁行为等同于对父表中外键值所在行做 `SELECT FOR UPDATE` 操作。
180+
`INSERT` 或者 `UPDATE` 子表时,外键约束会检查父表中是否存在对应的外键值,并对父表中的该行数据上锁,避免该外键值被其他操作删除,导致破坏外键约束。
181181

182-
因为 TiDB 目前暂不支持 `LOCK IN SHARE MODE`,所以,在并发写入子表场景,如果引用的外键值大部分都一样,可能会有比较严重的锁冲突。建议在大批量写入子表数据时,关闭 [`foreign_key_checks`](/system-variables.md#foreign_key_checks)
182+
默认情况下,在悲观事务中,外键检查对父表中行的加锁行为等价于对该行执行一次 `SELECT ... FOR UPDATE` 的锁定读(即加排他锁)。在子表高并发写入的场景下,如果大量事务反复引用相同的父表行,可能出现较严重的锁冲突。
183+
184+
你可以通过开启系统变量 [`tidb_foreign_key_check_in_shared_lock`](/system-variables.md#tidb_foreign_key_check_in_shared_lock-从-v856-和-v900-版本开始引入) 来让外键检查使用共享锁。共享锁允许多个事务在同一父表行同时完成外键检查,从而减少锁冲突,提升子表并发写入性能。
183185

184186
## 外键的定义和元信息
185187

system-variables.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,6 +2736,15 @@ v5.0 后,用户仍可以单独修改以上系统变量(会有废弃警告)
27362736
>
27372737
> TiDB 从 v6.6.0 版本开始支持[使用资源管控 (Resource Control) 实现资源组限制和流控](/tidb-resource-control-ru-groups.md)功能。该功能可以将不同优先级的语句放在不同的资源组中执行,并为这些资源组分配不同的配额和优先级,可以达到更好的资源管控效果。在开启资源管控功能后,语句的调度主要受资源组的控制,`PRIORITY` 将不再生效。建议在支持资源管控的版本优先使用资源管控功能。
27382738

2739+
### `tidb_foreign_key_check_in_shared_lock` <span class="version-mark">从 v8.5.6 和 v9.0.0 版本开始引入</span>
2740+
2741+
- 作用域:SESSION | GLOBAL
2742+
- 是否持久化到集群:是
2743+
- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否
2744+
- 类型:布尔型
2745+
- 默认值:`OFF`
2746+
- 该变量用于控制在悲观事务中,外键约束检查对父表中的行加锁时是否使用共享锁(而非排他锁)。开启后,多个并发事务可以同时对同一父表行执行外键检查而不互相阻塞,从而降低锁冲突并提升子表并发写入性能。
2747+
27392748
### `tidb_gc_concurrency` <span class="version-mark">从 v5.0 版本开始引入</span>
27402749

27412750
- 作用域:GLOBAL

0 commit comments

Comments
 (0)