From 6be88fb31fc4189f3e9b9d783667f1265b166817 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Thu, 20 Feb 2020 21:24:20 +0800 Subject: [PATCH 1/4] reference: improve the document of pessimistic transaction Signed-off-by: youjiali1995 --- .../tidb-server/configuration-file.md | 12 ++++ .../tidb-server/mysql-variables.md | 1 + .../tidb-server/tidb-specific-variables.md | 12 ++-- .../tikv-server/configuration-file.md | 18 +++++ .../transactions/transaction-model.md | 2 +- .../transactions/transaction-pessimistic.md | 68 +++++++++++++----- .../tidb-server/configuration-file.md | 12 ++++ .../tidb-server/mysql-variables.md | 1 + .../tidb-server/tidb-specific-variables.md | 13 ++-- .../tikv-server/configuration-file.md | 18 +++++ .../transactions/transaction-model.md | 2 +- .../transactions/transaction-pessimistic.md | 70 +++++++++++++------ .../tidb-server/configuration-file.md | 12 ++++ .../tidb-server/mysql-variables.md | 1 + .../tidb-server/tidb-specific-variables.md | 12 ++-- .../tikv-server/configuration-file.md | 18 +++++ .../transactions/transaction-model.md | 2 +- .../transactions/transaction-pessimistic.md | 68 ++++++++++++------ 18 files changed, 266 insertions(+), 76 deletions(-) diff --git a/dev/reference/configuration/tidb-server/configuration-file.md b/dev/reference/configuration/tidb-server/configuration-file.md index 9f4118e05721..73a81a629ca6 100644 --- a/dev/reference/configuration/tidb-server/configuration-file.md +++ b/dev/reference/configuration/tidb-server/configuration-file.md @@ -430,3 +430,15 @@ TiDB 服务状态相关配置。 + `events_statement_summary_by_digest` 表中`DIGEST_TEXT` 和 `QUERY_SAMPLE_TEXT` 列的最大显示长度。 + 默认值:4096 + +## pessimistic-txn + +### enable + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### max-retry-count + ++ 悲观事务中每个语句最大重试次数,超出该限制将会报错。 ++ 默认值:256 diff --git a/dev/reference/configuration/tidb-server/mysql-variables.md b/dev/reference/configuration/tidb-server/mysql-variables.md index 0decd3c186f0..794cd7686d05 100644 --- a/dev/reference/configuration/tidb-server/mysql-variables.md +++ b/dev/reference/configuration/tidb-server/mysql-variables.md @@ -189,6 +189,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | +| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | > **注意:** > diff --git a/dev/reference/configuration/tidb-server/tidb-specific-variables.md b/dev/reference/configuration/tidb-server/tidb-specific-variables.md index 500c2f146a45..f7cdc155cd10 100644 --- a/dev/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/dev/reference/configuration/tidb-server/tidb-specific-variables.md @@ -464,13 +464,15 @@ set tidb_query_log_max_len = 20; ### tidb_txn_mode -作用域:SESSION(自 TiDB 3.0.4 起支持 GLOBAL) +作用域:SESSION | GLOBAL -默认值:"" +默认值:"pessimistic" + +这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 -这个变量用于设置事务模式,默认是乐观锁模式。TiDB 3.0 加入了悲观锁模式(实验性)。将 `tidb_txn_mode` 设置为 `'pessimistic'` 后,这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。更多关于悲观锁的细节,可以参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 +但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -自 TiDB 3.0.4 起,该变量也支持 GLOBAL 作用域,用于设定全局的事务模式。当设定全局的事务模式时,仅在修改生效之后创建的 session 会受到影响。 +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 ### tidb_constraint_check_in_place @@ -478,7 +480,7 @@ set tidb_query_log_max_len = 20; 默认值:0 -TiDB 默认采用乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 +TiDB 支持乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 这个变量用来控制是否每次写入一行时就执行一次唯一性检查。注意,开启该变量后,在大批量写入场景下,对性能会有影响。 diff --git a/dev/reference/configuration/tikv-server/configuration-file.md b/dev/reference/configuration/tikv-server/configuration-file.md index 861a25bc30f2..9a2180189adc 100644 --- a/dev/reference/configuration/tikv-server/configuration-file.md +++ b/dev/reference/configuration/tikv-server/configuration-file.md @@ -1072,3 +1072,21 @@ import 相关的配置项。 + 并发导入工作任务数。 + 默认值:8 + 最小值:1 + +## pessimistic-txn + +### `enabled` + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### `wait-for-lock-timeout` + ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 默认值:1000 ++ 最小值:1 + +### `wait-up-delay-duration` + ++ 悲观事务释放锁时,只会唤醒等锁事务中 start ts 最小的事务,其他事务将会延迟 `wake-up-delay-duration` 毫秒之后被唤醒。 ++ 默认值:20 diff --git a/dev/reference/transactions/transaction-model.md b/dev/reference/transactions/transaction-model.md index 5b72a91d5718..2e24565c8090 100644 --- a/dev/reference/transactions/transaction-model.md +++ b/dev/reference/transactions/transaction-model.md @@ -5,7 +5,7 @@ category: reference # 事务模型 -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 +TiDB 支持乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 ## 事务限制 diff --git a/dev/reference/transactions/transaction-pessimistic.md b/dev/reference/transactions/transaction-pessimistic.md index dcba48a52a52..8166da716fdf 100644 --- a/dev/reference/transactions/transaction-pessimistic.md +++ b/dev/reference/transactions/transaction-pessimistic.md @@ -5,9 +5,33 @@ category: reference # TiDB 悲观事务模式 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 +在 v3.0.8 之前,TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +## 悲观事务的使用方法 + +进入悲观事务模式有以下三种方式: + +- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下三种方式使事务进入乐观事务模式: + +- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'optimistic';` 或 `set @@tidb_txn_mode = '';`,使当前的 session 执行的事务进入乐观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'optimistic;'` 或 `set @@global.tidb_txn_mode = '';`,使之后整个集群所有新创建 session 执行的事务都进入乐观事务模式。 + +`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量,从而支持悲观、乐观事务混合使用。 + +如果想要禁用悲观事务特性,可以修改 TiDB 配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`。 + ## 悲观事务模式的行为 悲观事务的行为和 MySQL 基本一致(不一致之处详见[和 MySQL InnoDB 的差异](#和-mysql-innodb-的差异)): @@ -22,7 +46,9 @@ TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败 - 事务提交或回滚的时候,会释放所有的锁。 -- 如果并发事务出现死锁,会被死锁检测器检测到,并返回兼容 MySQL 的错误码 `1213`。 +- 当有多个事务同时等待同一个锁释放时,会尽可能按照事务 start ts 顺序获取锁,但不能严格保证。 + +- 如果并发事务出现死锁,会被死锁检测器检测到,随机终止掉其中一个事务并返回兼容 MySQL 的错误码 `1213`。 - 乐观事务和悲观事务可以共存,事务可以任意指定使用乐观模式或悲观模式来执行。 @@ -30,34 +56,38 @@ TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败 - 支持 `FOR UPDATE NOWAIT` 语法,遇到锁时不会阻塞等锁,而是返回兼容 MySQL 的错误码 `3572`。 -## 悲观事务的使用方法 +## 和 MySQL InnoDB 的差异 -进入悲观事务模式有以下三种方式: +1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 -- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 + InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 -- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 +2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 -- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建的 session 都会进入悲观事务模式执行显式事务。 + 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 -在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下两种方式使事务进入乐观事务模式: +3. DDL 可能会导致悲观事务提交失败。 -- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 + MySQL 在执行 DDL 时会被正在执行的事务阻塞住,而在 TiDB 中 DDL 操作会成功,造成悲观事务提交失败:`ERROR 1105 (HY000): Information schema is changed. [try again later]`。 -- 执行 `set @@tidb_txn_mode = 'optimistic';`,使当前的 session 执行的事务进入乐观事务模式。 +4. `START TRANSACTION WITH CONSISTENT SNAPSHOT` 之后,MySQL 仍然可以读取到之后在其他事务创建的表,而 TiDB 不能。 -`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量。 +5. autocommit 事务不支持悲观锁 -如果想要禁用悲观事务特性,可以修改配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`. + 所有自动提交的语句都不会加悲观锁,该类语句在用户侧感知不到区别,因为悲观事务的本质是把整个事务的重试变成了单个 DML 的重试,autocommit 事务即使在 TiDB 关闭重试时也会自动重试,效果和悲观事务相同。 -## 和 MySQL InnoDB 的差异 + 自动提交的 select for update 语句也不会等锁。 -1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 +## 常见问题 - InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 +1. TiDB 日志出现 `pessimistic write conflict, retry statement`。 -2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 + 当发生 write conflict 时,乐观事务会直接终止,而悲观事务会尝试用最新数据重试该语句直到没有 write conflict,每次重试都会打印该 log,不用特别关注。 - 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 +2. 执行 DML 时报错 `pessimistic lock retry limit reached`。 + + 悲观事务每个语句有重试次数限制,当因 write conflict 重试超过该限制时会报该错误,默认为 256 次,可通过 TiDB 配置文件 `[pessimistic-txn]` 类别下的 `max-retry-limit` 修改。 + +3. 悲观事务执行时间限制。 + + 除了有事务执行时间不能超出 `tikv_gc_life_time` 的限制外,悲观事务的 TTL 有 10 分钟上限,所以执行时间超过 10 分钟的悲观事务有可能提交失败。 diff --git a/v3.0/reference/configuration/tidb-server/configuration-file.md b/v3.0/reference/configuration/tidb-server/configuration-file.md index 2b4a66d11da6..b58052d78828 100644 --- a/v3.0/reference/configuration/tidb-server/configuration-file.md +++ b/v3.0/reference/configuration/tidb-server/configuration-file.md @@ -409,3 +409,15 @@ TiDB 服务状态相关配置。 + `events_statement_summary_by_digest` 表中`DIGEST_TEXT` 和 `QUERY_SAMPLE_TEXT` 列的最大显示长度。 + 默认值:4096 + +## pessimistic-txn + +### enable + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### max-retry-count + ++ 悲观事务中每个语句最大重试次数,超出该限制将会报错。 ++ 默认值:256 diff --git a/v3.0/reference/configuration/tidb-server/mysql-variables.md b/v3.0/reference/configuration/tidb-server/mysql-variables.md index 9de878bdcba4..095eec0390a8 100644 --- a/v3.0/reference/configuration/tidb-server/mysql-variables.md +++ b/v3.0/reference/configuration/tidb-server/mysql-variables.md @@ -191,6 +191,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | +| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | > **注意:** > diff --git a/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md b/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md index 72ea5c33fd71..1a633c4b08b5 100644 --- a/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md @@ -464,23 +464,28 @@ set tidb_slow_log_threshold = 200; set tidb_query_log_max_len = 20; ``` -### tidb_txn_mode +### tidb_txn_mode 从 v3.0.4 版本开始引入 作用域:SESSION(自 TiDB 3.0.4 起支持 GLOBAL) -默认值:"" +默认值:"pessimistic" + +这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 -这个变量用于设置事务模式,默认是乐观锁模式。TiDB 3.0 加入了悲观锁模式(实验性)。将 `tidb_txn_mode` 设置为 `'pessimistic'` 后,这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。更多关于悲观锁的细节,可以参考 [TiDB 悲观事务模式](/v3.0/reference/transactions/transaction-pessimistic.md)。 +但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 + +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 自 TiDB 3.0.4 起,该变量也支持 GLOBAL 作用域,用于设定全局的事务模式。当设定全局的事务模式时,仅在修改生效之后创建的 session 会受到影响。 + ### tidb_constraint_check_in_place 作用域:SESSION | GLOBAL 默认值:0 -TiDB 默认采用乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 +TiDB 支持乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 这个变量用来控制是否每次写入一行时就执行一次唯一性检查。注意,开启该变量后,在大批量写入场景下,对性能会有影响。 diff --git a/v3.0/reference/configuration/tikv-server/configuration-file.md b/v3.0/reference/configuration/tikv-server/configuration-file.md index 976481b85341..df37dc90e8ec 100644 --- a/v3.0/reference/configuration/tikv-server/configuration-file.md +++ b/v3.0/reference/configuration/tikv-server/configuration-file.md @@ -1073,3 +1073,21 @@ import 相关的配置项。 + 并发导入工作任务数。 + 默认值:8 + 最小值:1 + +## pessimistic-txn + +### `enabled` + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### `wait-for-lock-timeout` + ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 默认值:1000 ++ 最小值:1 + +### `wait-up-delay-duration` + ++ 悲观事务释放锁时,只会唤醒等锁事务中 start ts 最小的事务,其他事务将会延迟 `wake-up-delay-duration` 毫秒之后被唤醒。 ++ 默认值:20 diff --git a/v3.0/reference/transactions/transaction-model.md b/v3.0/reference/transactions/transaction-model.md index 5b72a91d5718..2e24565c8090 100644 --- a/v3.0/reference/transactions/transaction-model.md +++ b/v3.0/reference/transactions/transaction-model.md @@ -5,7 +5,7 @@ category: reference # 事务模型 -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 +TiDB 支持乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 ## 事务限制 diff --git a/v3.0/reference/transactions/transaction-pessimistic.md b/v3.0/reference/transactions/transaction-pessimistic.md index 005f49aa4d19..8e6f7abb6201 100644 --- a/v3.0/reference/transactions/transaction-pessimistic.md +++ b/v3.0/reference/transactions/transaction-pessimistic.md @@ -5,9 +5,33 @@ category: reference # TiDB 悲观事务模式 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 +在 v3.0.8 之前,TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +## 悲观事务的使用方法 + +进入悲观事务模式有以下三种方式: + +- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下三种方式使事务进入乐观事务模式: + +- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'optimistic';` 或 `set @@tidb_txn_mode = '';`,使当前的 session 执行的事务进入乐观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'optimistic;'` 或 `set @@global.tidb_txn_mode = '';`,使之后整个集群所有新创建 session 执行的事务都进入乐观事务模式。 + +`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量,从而支持悲观、乐观事务混合使用。 + +如果想要禁用悲观事务特性,可以修改 TiDB 配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`。 + ## 悲观事务模式的行为 悲观事务的行为和 MySQL 基本一致(不一致之处详见[和 MySQL InnoDB 的差异](#和-mysql-innodb-的差异)): @@ -22,40 +46,46 @@ TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败 - 事务提交或回滚的时候,会释放所有的锁。 -- 如果并发事务出现死锁,会被死锁检测器检测到,并返回兼容 MySQL 的错误码 `1213`。 +- 当有多个事务同时等待同一个锁释放时,会尽可能按照事务 start ts 顺序获取锁,但不能严格保证。 + +- 如果并发事务出现死锁,会被死锁检测器检测到,随机终止掉其中一个事务并返回兼容 MySQL 的错误码 `1213`。 - 乐观事务和悲观事务可以共存,事务可以任意指定使用乐观模式或悲观模式来执行。 -- 通过设置 `innodb_wait_timeout` 变量 从 v3.0.6 开始引入,设置等锁超时时间,等锁超时后返回兼容 MySQL 的错误码 `1205`。 +- 通过设置 `innodb_wait_timeout` 变量,设置等锁超时时间,等锁超时后返回兼容 MySQL 的错误码 `1205`。 -## 悲观事务的使用方法 +## 和 MySQL InnoDB 的差异 -进入悲观事务模式有以下三种方式: +1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 -- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 + InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 -- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 +2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 -- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建的 session 都会进入悲观事务模式执行显式事务。 + 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 -在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下两种方式使事务进入乐观事务模式: +3. DDL 可能会导致悲观事务提交失败。 -- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 + MySQL 在执行 DDL 时会被正在执行的事务阻塞住,而在 TiDB 中 DDL 操作会成功,造成悲观事务提交失败:`ERROR 1105 (HY000): Information schema is changed. [try again later]`。 -- 执行 `set @@tidb_txn_mode = 'optimistic';`,使当前的 session 执行的事务进入乐观事务模式。 +4. `START TRANSACTION WITH CONSISTENT SNAPSHOT` 之后,MySQL 仍然可以读取到之后在其他事务创建的表,而 TiDB 不能。 -`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量。 +5. autocommit 事务不支持悲观锁 -如果想要禁用悲观事务特性,可以修改配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`. + 所有自动提交的语句都不会加悲观锁,该类语句在用户侧感知不到区别,因为悲观事务的本质是把整个事务的重试变成了单个 DML 的重试,autocommit 事务即使在 TiDB 关闭重试时也会自动重试,效果和悲观事务相同。 -## 和 MySQL InnoDB 的差异 + 自动提交的 select for update 语句也不会等锁。 -1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 +## 常见问题 - InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 +1. TiDB 日志出现 `pessimistic write conflict, retry statement`。 -2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 + 当发生 write conflict 时,乐观事务会直接终止,而悲观事务会尝试用最新数据重试该语句直到没有 write conflict,每次重试都会打印该 log,不用特别关注。 - 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 +2. 执行 DML 时报错 `pessimistic lock retry limit reached`。 + + 悲观事务每个语句有重试次数限制,当因 write conflict 重试超过该限制时会报该错误,默认为 256 次,可通过 TiDB 配置文件 `[pessimistic-txn]` 类别下的 `max-retry-limit` 修改。 + +3. 悲观事务执行时间限制。 + + 除了有事务执行时间不能超出 `tikv_gc_life_time` 的限制外,悲观事务的 TTL 有 10 分钟上限,所以执行时间超过 10 分钟的悲观事务有可能提交失败。 diff --git a/v3.1/reference/configuration/tidb-server/configuration-file.md b/v3.1/reference/configuration/tidb-server/configuration-file.md index 2ba6d379f2d2..e2866b608f4f 100644 --- a/v3.1/reference/configuration/tidb-server/configuration-file.md +++ b/v3.1/reference/configuration/tidb-server/configuration-file.md @@ -408,3 +408,15 @@ TiDB 服务状态相关配置。 + `events_statement_summary_by_digest` 表中`DIGEST_TEXT` 和 `QUERY_SAMPLE_TEXT` 列的最大显示长度。 + 默认值:4096 + +## pessimistic-txn + +### enable + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### max-retry-count + ++ 悲观事务中每个语句最大重试次数,超出该限制将会报错。 ++ 默认值:256 diff --git a/v3.1/reference/configuration/tidb-server/mysql-variables.md b/v3.1/reference/configuration/tidb-server/mysql-variables.md index 20fc99923406..84e6d2bed06c 100644 --- a/v3.1/reference/configuration/tidb-server/mysql-variables.md +++ b/v3.1/reference/configuration/tidb-server/mysql-variables.md @@ -190,6 +190,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | +| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | > **注意:** > diff --git a/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md b/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md index 786a8a61b541..9a0a3f1e16fe 100644 --- a/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md @@ -465,13 +465,15 @@ set tidb_query_log_max_len = 20; ### tidb_txn_mode -作用域:SESSION(自 TiDB 3.0.4 起支持 GLOBAL) +作用域:SESSION | GLOBAL -默认值:"" +默认值:"pessimistic" + +这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 -这个变量用于设置事务模式,默认是乐观锁模式。TiDB 3.0 加入了悲观锁模式(实验性)。将 `tidb_txn_mode` 设置为 `'pessimistic'` 后,这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。更多关于悲观锁的细节,可以参考 [TiDB 悲观事务模式](/v3.1/reference/transactions/transaction-pessimistic.md)。 +但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -自 TiDB 3.0.4 起,该变量也支持 GLOBAL 作用域,用于设定全局的事务模式。当设定全局的事务模式时,仅在修改生效之后创建的 session 会受到影响。 +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 ### tidb_constraint_check_in_place @@ -479,7 +481,7 @@ set tidb_query_log_max_len = 20; 默认值:0 -TiDB 默认采用乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 +TiDB 支持乐观事务模型,即在执行写入时,假设不存在冲突。冲突检查是在最后 commit 提交时才去检查。这里的检查指 unique key 检查。 这个变量用来控制是否每次写入一行时就执行一次唯一性检查。注意,开启该变量后,在大批量写入场景下,对性能会有影响。 diff --git a/v3.1/reference/configuration/tikv-server/configuration-file.md b/v3.1/reference/configuration/tikv-server/configuration-file.md index 1bed2f63be21..4b2ebcda18e2 100644 --- a/v3.1/reference/configuration/tikv-server/configuration-file.md +++ b/v3.1/reference/configuration/tikv-server/configuration-file.md @@ -1073,3 +1073,21 @@ import 相关的配置项。 + 并发导入工作任务数。 + 默认值:8 + 最小值:1 + +## pessimistic-txn + +### `enabled` + ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 默认值:true + +### `wait-for-lock-timeout` + ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 默认值:1000 ++ 最小值:1 + +### `wait-up-delay-duration` + ++ 悲观事务释放锁时,只会唤醒等锁事务中 start ts 最小的事务,其他事务将会延迟 `wake-up-delay-duration` 毫秒之后被唤醒。 ++ 默认值:20 diff --git a/v3.1/reference/transactions/transaction-model.md b/v3.1/reference/transactions/transaction-model.md index 5b72a91d5718..2e24565c8090 100644 --- a/v3.1/reference/transactions/transaction-model.md +++ b/v3.1/reference/transactions/transaction-model.md @@ -5,7 +5,7 @@ category: reference # 事务模型 -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 +TiDB 支持乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 ## 事务限制 diff --git a/v3.1/reference/transactions/transaction-pessimistic.md b/v3.1/reference/transactions/transaction-pessimistic.md index dcba48a52a52..8e6f7abb6201 100644 --- a/v3.1/reference/transactions/transaction-pessimistic.md +++ b/v3.1/reference/transactions/transaction-pessimistic.md @@ -5,9 +5,33 @@ category: reference # TiDB 悲观事务模式 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 +在 v3.0.8 之前,TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +## 悲观事务的使用方法 + +进入悲观事务模式有以下三种方式: + +- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)都会进入悲观事务模式。 + +在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下三种方式使事务进入乐观事务模式: + +- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 +可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 + +- 执行 `set @@tidb_txn_mode = 'optimistic';` 或 `set @@tidb_txn_mode = '';`,使当前的 session 执行的事务进入乐观事务模式。 + +- 执行 `set @@global.tidb_txn_mode = 'optimistic;'` 或 `set @@global.tidb_txn_mode = '';`,使之后整个集群所有新创建 session 执行的事务都进入乐观事务模式。 + +`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量,从而支持悲观、乐观事务混合使用。 + +如果想要禁用悲观事务特性,可以修改 TiDB 配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`。 + ## 悲观事务模式的行为 悲观事务的行为和 MySQL 基本一致(不一致之处详见[和 MySQL InnoDB 的差异](#和-mysql-innodb-的差异)): @@ -22,42 +46,46 @@ TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败 - 事务提交或回滚的时候,会释放所有的锁。 -- 如果并发事务出现死锁,会被死锁检测器检测到,并返回兼容 MySQL 的错误码 `1213`。 +- 当有多个事务同时等待同一个锁释放时,会尽可能按照事务 start ts 顺序获取锁,但不能严格保证。 + +- 如果并发事务出现死锁,会被死锁检测器检测到,随机终止掉其中一个事务并返回兼容 MySQL 的错误码 `1213`。 - 乐观事务和悲观事务可以共存,事务可以任意指定使用乐观模式或悲观模式来执行。 - 通过设置 `innodb_wait_timeout` 变量,设置等锁超时时间,等锁超时后返回兼容 MySQL 的错误码 `1205`。 -- 支持 `FOR UPDATE NOWAIT` 语法,遇到锁时不会阻塞等锁,而是返回兼容 MySQL 的错误码 `3572`。 +## 和 MySQL InnoDB 的差异 -## 悲观事务的使用方法 +1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 -进入悲观事务模式有以下三种方式: + InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 -- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 +2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 -- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 + 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 -- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建的 session 都会进入悲观事务模式执行显式事务。 +3. DDL 可能会导致悲观事务提交失败。 -在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下两种方式使事务进入乐观事务模式: + MySQL 在执行 DDL 时会被正在执行的事务阻塞住,而在 TiDB 中 DDL 操作会成功,造成悲观事务提交失败:`ERROR 1105 (HY000): Information schema is changed. [try again later]`。 -- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 +4. `START TRANSACTION WITH CONSISTENT SNAPSHOT` 之后,MySQL 仍然可以读取到之后在其他事务创建的表,而 TiDB 不能。 -- 执行 `set @@tidb_txn_mode = 'optimistic';`,使当前的 session 执行的事务进入乐观事务模式。 +5. autocommit 事务不支持悲观锁 -`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量。 + 所有自动提交的语句都不会加悲观锁,该类语句在用户侧感知不到区别,因为悲观事务的本质是把整个事务的重试变成了单个 DML 的重试,autocommit 事务即使在 TiDB 关闭重试时也会自动重试,效果和悲观事务相同。 -如果想要禁用悲观事务特性,可以修改配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`. + 自动提交的 select for update 语句也不会等锁。 -## 和 MySQL InnoDB 的差异 +## 常见问题 -1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 +1. TiDB 日志出现 `pessimistic write conflict, retry statement`。 - InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 + 当发生 write conflict 时,乐观事务会直接终止,而悲观事务会尝试用最新数据重试该语句直到没有 write conflict,每次重试都会打印该 log,不用特别关注。 -2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 +2. 执行 DML 时报错 `pessimistic lock retry limit reached`。 - 使用这个语句执行的时候,效果和没有加锁是一样的,不会阻塞其他事务的读写。 + 悲观事务每个语句有重试次数限制,当因 write conflict 重试超过该限制时会报该错误,默认为 256 次,可通过 TiDB 配置文件 `[pessimistic-txn]` 类别下的 `max-retry-limit` 修改。 + +3. 悲观事务执行时间限制。 + + 除了有事务执行时间不能超出 `tikv_gc_life_time` 的限制外,悲观事务的 TTL 有 10 分钟上限,所以执行时间超过 10 分钟的悲观事务有可能提交失败。 From 413479ac4d56c4f076ab67754240efaee2d5de72 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Thu, 20 Feb 2020 21:43:03 +0800 Subject: [PATCH 2/4] fix lint Signed-off-by: youjiali1995 --- .../configuration/tidb-server/tidb-specific-variables.md | 2 +- .../configuration/tidb-server/configuration-file.md | 2 +- .../configuration/tidb-server/tidb-specific-variables.md | 5 ++--- .../configuration/tikv-server/configuration-file.md | 2 +- .../configuration/tidb-server/configuration-file.md | 2 +- .../configuration/tidb-server/tidb-specific-variables.md | 4 ++-- .../configuration/tikv-server/configuration-file.md | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dev/reference/configuration/tidb-server/tidb-specific-variables.md b/dev/reference/configuration/tidb-server/tidb-specific-variables.md index cd299510c80b..c37ee6f13e00 100644 --- a/dev/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/dev/reference/configuration/tidb-server/tidb-specific-variables.md @@ -472,7 +472,7 @@ set tidb_query_log_max_len = 20; 但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-optimistic.md)。 ### tidb_constraint_check_in_place diff --git a/v3.0/reference/configuration/tidb-server/configuration-file.md b/v3.0/reference/configuration/tidb-server/configuration-file.md index b58052d78828..30ad141cfc53 100644 --- a/v3.0/reference/configuration/tidb-server/configuration-file.md +++ b/v3.0/reference/configuration/tidb-server/configuration-file.md @@ -414,7 +414,7 @@ TiDB 服务状态相关配置。 ### enable -+ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/v3.0/reference/transactions/transaction-pessimistic.md)。 + 默认值:true ### max-retry-count diff --git a/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md b/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md index 514082d21c7f..0006363caf8b 100644 --- a/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md @@ -470,15 +470,14 @@ set tidb_query_log_max_len = 20; 默认值:"pessimistic" -这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 +这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/v3.0/reference/transactions/transaction-pessimistic.md)。 但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/v3.0/reference/transactions/transaction-optimistic.md)。 自 TiDB 3.0.4 起,该变量也支持 GLOBAL 作用域,用于设定全局的事务模式。当设定全局的事务模式时,仅在修改生效之后创建的 session 会受到影响。 - ### tidb_constraint_check_in_place 作用域:SESSION | GLOBAL diff --git a/v3.0/reference/configuration/tikv-server/configuration-file.md b/v3.0/reference/configuration/tikv-server/configuration-file.md index df37dc90e8ec..7c15d3828681 100644 --- a/v3.0/reference/configuration/tikv-server/configuration-file.md +++ b/v3.0/reference/configuration/tikv-server/configuration-file.md @@ -1078,7 +1078,7 @@ import 相关的配置项。 ### `enabled` -+ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/v3.0/reference/transactions/transaction-pessimistic.md)。 + 默认值:true ### `wait-for-lock-timeout` diff --git a/v3.1/reference/configuration/tidb-server/configuration-file.md b/v3.1/reference/configuration/tidb-server/configuration-file.md index e2866b608f4f..a3007f2625f6 100644 --- a/v3.1/reference/configuration/tidb-server/configuration-file.md +++ b/v3.1/reference/configuration/tidb-server/configuration-file.md @@ -413,7 +413,7 @@ TiDB 服务状态相关配置。 ### enable -+ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/v3.1/reference/transactions/transaction-pessimistic.md)。 + 默认值:true ### max-retry-count diff --git a/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md b/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md index b21cc5f72dce..c488943b38ce 100644 --- a/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md @@ -469,11 +469,11 @@ set tidb_query_log_max_len = 20; 默认值:"pessimistic" -这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 +这个变量用于设置事务模式。TiDB v3.0 支持了悲观事务,自 v3.0.8 开始,默认使用[悲观事务模式](/v3.1/reference/transactions/transaction-pessimistic.md)。 但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/dev/reference/transactions/transaction-model.md)。 +将该变量设置为 "optimistic" 或 "" 时,将会使用[乐观事务模式](/v3.1/reference/transactions/transaction-optimistic.md)。 ### tidb_constraint_check_in_place diff --git a/v3.1/reference/configuration/tikv-server/configuration-file.md b/v3.1/reference/configuration/tikv-server/configuration-file.md index 4b2ebcda18e2..6b1b1867e01d 100644 --- a/v3.1/reference/configuration/tikv-server/configuration-file.md +++ b/v3.1/reference/configuration/tikv-server/configuration-file.md @@ -1078,7 +1078,7 @@ import 相关的配置项。 ### `enabled` -+ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/dev/reference/transactions/transaction-pessimistic.md)。 ++ 开启悲观事务支持,悲观事务使用方法请参考 [TiDB 悲观事务模式](/v3.1/reference/transactions/transaction-pessimistic.md)。 + 默认值:true ### `wait-for-lock-timeout` From 9ca0656d1606a24a89f069067cc7086443001183 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Fri, 21 Feb 2020 12:05:54 +0800 Subject: [PATCH 3/4] address comments Signed-off-by: youjiali1995 --- dev/reference/configuration/tidb-server/mysql-variables.md | 2 +- dev/reference/configuration/tikv-server/configuration-file.md | 2 +- v3.0/reference/configuration/tidb-server/mysql-variables.md | 2 +- v3.0/reference/configuration/tikv-server/configuration-file.md | 2 +- v3.1/reference/configuration/tidb-server/mysql-variables.md | 2 +- v3.1/reference/configuration/tikv-server/configuration-file.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dev/reference/configuration/tidb-server/mysql-variables.md b/dev/reference/configuration/tidb-server/mysql-variables.md index 794cd7686d05..6e3efe90095a 100644 --- a/dev/reference/configuration/tidb-server/mysql-variables.md +++ b/dev/reference/configuration/tidb-server/mysql-variables.md @@ -189,7 +189,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | -| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | +| innodb\_lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为秒 | > **注意:** > diff --git a/dev/reference/configuration/tikv-server/configuration-file.md b/dev/reference/configuration/tikv-server/configuration-file.md index 9a2180189adc..3aaadfe3edfe 100644 --- a/dev/reference/configuration/tikv-server/configuration-file.md +++ b/dev/reference/configuration/tikv-server/configuration-file.md @@ -1082,7 +1082,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1 diff --git a/v3.0/reference/configuration/tidb-server/mysql-variables.md b/v3.0/reference/configuration/tidb-server/mysql-variables.md index 095eec0390a8..14b367554a1c 100644 --- a/v3.0/reference/configuration/tidb-server/mysql-variables.md +++ b/v3.0/reference/configuration/tidb-server/mysql-variables.md @@ -191,7 +191,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | -| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | +| innodb\_lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为秒 | > **注意:** > diff --git a/v3.0/reference/configuration/tikv-server/configuration-file.md b/v3.0/reference/configuration/tikv-server/configuration-file.md index 7c15d3828681..a88df7f8a5d8 100644 --- a/v3.0/reference/configuration/tikv-server/configuration-file.md +++ b/v3.0/reference/configuration/tikv-server/configuration-file.md @@ -1083,7 +1083,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1 diff --git a/v3.1/reference/configuration/tidb-server/mysql-variables.md b/v3.1/reference/configuration/tidb-server/mysql-variables.md index 84e6d2bed06c..855bdd756c9b 100644 --- a/v3.1/reference/configuration/tidb-server/mysql-variables.md +++ b/v3.1/reference/configuration/tidb-server/mysql-variables.md @@ -190,7 +190,7 @@ MySQL 系统变量 (System Variables) 是一些系统参数,用于调整数据 | time_zone | GLOBAL \| SESSION | 数据库所使用的时区 | | tx_isolation | GLOBAL \| SESSION | 事务隔离级别 | | max\_execution\_time | GLOBAL \| SESSION | 语句超时时间,单位为毫秒 | -| lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为妙 | +| innodb\_lock\_wait\_timeout | GLOBAL \| SESSION | 悲观事务语句等锁时间,单位为秒 | > **注意:** > diff --git a/v3.1/reference/configuration/tikv-server/configuration-file.md b/v3.1/reference/configuration/tikv-server/configuration-file.md index 6b1b1867e01d..3d8857382fa3 100644 --- a/v3.1/reference/configuration/tikv-server/configuration-file.md +++ b/v3.1/reference/configuration/tikv-server/configuration-file.md @@ -1083,7 +1083,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1 From d0292f6daf493627bacea7777adf0d99c29b7598 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Fri, 21 Feb 2020 12:33:46 +0800 Subject: [PATCH 4/4] address comment Signed-off-by: youjiali1995 --- dev/reference/configuration/tikv-server/configuration-file.md | 2 +- v3.0/reference/configuration/tikv-server/configuration-file.md | 2 +- v3.1/reference/configuration/tikv-server/configuration-file.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/reference/configuration/tikv-server/configuration-file.md b/dev/reference/configuration/tikv-server/configuration-file.md index 3aaadfe3edfe..77cfd2555a35 100644 --- a/dev/reference/configuration/tikv-server/configuration-file.md +++ b/dev/reference/configuration/tikv-server/configuration-file.md @@ -1082,7 +1082,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `innodb_lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1 diff --git a/v3.0/reference/configuration/tikv-server/configuration-file.md b/v3.0/reference/configuration/tikv-server/configuration-file.md index a88df7f8a5d8..322c5edf7b8c 100644 --- a/v3.0/reference/configuration/tikv-server/configuration-file.md +++ b/v3.0/reference/configuration/tikv-server/configuration-file.md @@ -1083,7 +1083,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `innodb_lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1 diff --git a/v3.1/reference/configuration/tikv-server/configuration-file.md b/v3.1/reference/configuration/tikv-server/configuration-file.md index 3d8857382fa3..bdf7e680b901 100644 --- a/v3.1/reference/configuration/tikv-server/configuration-file.md +++ b/v3.1/reference/configuration/tikv-server/configuration-file.md @@ -1083,7 +1083,7 @@ import 相关的配置项。 ### `wait-for-lock-timeout` -+ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `lock_wait_timeout` 控制。 ++ 悲观事务在 TiKV 中等待其他事务释放锁的最长时间,单位为毫秒。若超时则会返回错误给 TiDB 并由 TiDB 重试加锁,语句最长等锁时间由 `innodb_lock_wait_timeout` 控制。 + 默认值:1000 + 最小值:1