From c22b0132981252475779057f470fddc36cc30a49 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Wed, 20 May 2020 20:11:16 +0800 Subject: [PATCH 01/10] update pessimistic transaction Signed-off-by: youjiali1995 --- media/pessimistic-transaction-pipelining.png | Bin 0 -> 16878 bytes pessimistic-transaction.md | 71 ++++++++++++++----- 2 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 media/pessimistic-transaction-pipelining.png diff --git a/media/pessimistic-transaction-pipelining.png b/media/pessimistic-transaction-pipelining.png new file mode 100644 index 0000000000000000000000000000000000000000..7149c374077f4bec935c7b51155726daf72f5d86 GIT binary patch literal 16878 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 literal 0 HcmV?d00001 diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 410292f2a491..ff92b9d8ed04 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -7,39 +7,45 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] # TiDB 悲观事务模型 -在 v3.0.8 之前,TiDB 默认使用的乐观事务模式会导致事务提交时因为冲突而失败。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +为了使 TiDB 的使用方式更加贴近传统数据库,降低用户迁移的成本,TiDB 自 v3.0 版本开始在乐观事务模型的基础上支持了悲观事务模型。本文将介绍 TiDB 悲观事务的相关特性。 -## 悲观事务的使用方法 +> **注意:** +> +> 自 v3.0.8 开始,新创建的 TiDB 集群默认使用悲观事务模型。但如果从 3.0.7 版本及之前的创建的集群升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 -进入悲观事务模式有以下三种方式: +## 事务模式的修改方法 -- 执行 `BEGIN PESSIMISTIC;` 语句开启的事务,会进入悲观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 PESSIMISTIC */;` 来兼容 MySQL 语法。 +TiDB 提供了 [tidb_txn_mode](/tidb-specific-system-variables.md#tidb_txn_mode) 系统变量用于设置事务模式,执行下面命令即可使整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)进入悲观事务模式: -- 执行 `set @@tidb_txn_mode = 'pessimistic';`,使这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。 +{{< copyable "sql" >}} -- 执行 `set @@global.tidb_txn_mode = 'pessimistic';`,使之后整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)都会进入悲观事务模式。 +```sql +set @@global.tidb_txn_mode = 'pessimistic'; +``` -在配置了 `global.tidb_txn_mode` 为 `pessimistic` 之后,默认进入悲观事务模式,但是可以用以下三种方式使事务进入乐观事务模式: +除此之外,还可以执行如下 SQL 显式开启悲观事务: -- 执行 `BEGIN OPTIMISTIC;` 语句开启的事务,会进入乐观事务模式。 -可以通过写成注释的形式 `BEGIN /*!90000 OPTIMISTIC */;` 来兼容 MySQL 语法。 +{{< copyable "sql" >}} -- 执行 `set @@tidb_txn_mode = 'optimistic';` 或 `set @@tidb_txn_mode = '';`,使当前的 session 执行的事务进入乐观事务模式。 +```sql +BEGIN PESSIMISTIC; +``` -- 执行 `set @@global.tidb_txn_mode = 'optimistic;'` 或 `set @@global.tidb_txn_mode = '';`,使之后整个集群所有新创建 session 执行的事务都进入乐观事务模式。 +{{< copyable "sql" >}} -`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量,从而支持悲观、乐观事务混合使用。 +``` +BEGIN /*!90000 PESSIMISTIC */; +``` -如果想要禁用悲观事务特性,可以修改 TiDB 配置文件,在 `[pessimistic-txn]` 类别下添加 `enable = false`。 +`BEGIN PESSIMISTIC;` 和 `BEGIN OPTIMISTIC;` 等语句的优先级高于 `tidb_txn_mode` 系统变量。使用这两个语句开启的事务,会忽略系统变量,从而支持悲观、乐观事务混合使用。 ## 悲观事务模式的行为 悲观事务的行为和 MySQL 基本一致(不一致之处详见[和 MySQL InnoDB 的差异](#和-mysql-innodb-的差异)): -- `SELECT FOR UPDATE` 会读取已提交的最新数据,并对读取到的数据加悲观锁。 +- `SELECT FOR UPDATE` 会读取已提交的**最新**数据,并对读取到的数据加悲观锁。 -- `UPDATE`、`DELETE` 和 `INSERT` 语句都会读取已提交的最新的数据来执行,并对修改的数据加悲观锁。 +- `UPDATE`、`DELETE` 和 `INSERT` 语句都会读取已提交的**最新**的数据来执行,并对修改的数据加悲观锁。 - 当一行数据被加了悲观锁以后,其他尝试修改这一行的写事务会被阻塞,等待悲观锁的释放。 @@ -56,6 +62,7 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] - 通过设置 `innodb_lock_wait_timeout` 变量,设置等锁超时时间,等锁超时后返回兼容 MySQL 的错误码 `1205`。 - 支持 `FOR UPDATE NOWAIT` 语法,遇到锁时不会阻塞等锁,而是返回兼容 MySQL 的错误码 `3572`。 + - 如果 `Point Get` 和 `Batch Point Get` 算子没有读到数据,依然会对给定的主键或者唯一键加锁,阻塞其他事务对相同主键唯一键加锁或者进行写入操作。 ## 和 MySQL InnoDB 的差异 @@ -74,12 +81,38 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] 4. `START TRANSACTION WITH CONSISTENT SNAPSHOT` 之后,MySQL 仍然可以读取到之后在其他事务创建的表,而 TiDB 不能。 -5. autocommit 事务不支持悲观锁 +5. autocommit 事务不支持悲观锁。 所有自动提交的语句都不会加悲观锁,该类语句在用户侧感知不到区别,因为悲观事务的本质是把整个事务的重试变成了单个 DML 的重试,autocommit 事务即使在 TiDB 关闭重试时也会自动重试,效果和悲观事务相同。 自动提交的 select for update 语句也不会等锁。 -6. 对语句中 `EMBEDDED SELECT` 读到的相关数据不会加锁。 + +6. 对语句中 `EMBEDDED SELECT` 读到的相关数据不会加锁。 + +## 隔离级别 + +TiDB 在悲观事务模式下支持了 2 种隔离级别: + +1. 默认使用与 MySQL 行为相同的[可重复读隔离级别 (Repeatable Read)](/transaction-isolation-levels.md#可重复读隔离级别-repeatable-read)。 + + > **注意:** + > + > 在这种隔离级别下 DML 会基于已提交的最新数据来执行,行为与 MySQL 相同,但与 TiDB 乐观事务不同,请参考 [与 MySQL 可重复读隔离级别的区别](/transaction-isolation-levels.md#与-mysql-可重复读隔离级别的区别)。 + +2. 使用 [SET TRANSACTION](/sql-statements/sql-statement-set-transaction.md) 可设置为 [读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 + +## Pipelined 加锁流程 + +加悲观锁需要向 TiKV 写入数据,要经过 raft 提交并 apply 后才能返回,相比于乐观事务,不可避免的会增加部分延迟。为了降低加锁的开销,TiKV 实现了 pipelined 加锁流程:当数据满足加锁要求时,TiKV 立刻通知 TiDB 执行后面的请求,并异步写入悲观锁,从而降低大部分延迟,显著提升悲观事务的性能。但有较低概率悲观锁异步写入失败,可能会导致悲观事务提交失败。 + +![Pipelined pessimistic lock](/media/pessimistic-transaction-pipelining.png) + +该功能默认关闭,可修改 TiKV 配置启用: + +```toml +[pessimistic-txn] +pipelined = true +``` ## 常见问题 @@ -93,4 +126,4 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] 3. 悲观事务执行时间限制。 - 除了有事务执行时间不能超出 `tikv_gc_life_time` 的限制外,悲观事务的 TTL 有 10 分钟上限,所以执行时间超过 10 分钟的悲观事务有可能提交失败。 + 在 v4.0 中,GC 已不会影响到正在运行的事务,但悲观事务的执行时间仍有上限,默认为 10 分钟,可通过 TiDB 配置文件 `[performance]` 类别下的 `max-txn-ttl` 修改。 From 4df8083ad3a9c7eebf29cf38a1c755ade20f141b Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Thu, 21 May 2020 19:57:05 +0800 Subject: [PATCH 02/10] Update pessimistic-transaction.md Co-authored-by: zhenjiao gao <26379799+zhenjiaogao@users.noreply.github.com> --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index ff92b9d8ed04..3d5a0926cf7d 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -11,7 +11,7 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] > **注意:** > -> 自 v3.0.8 开始,新创建的 TiDB 集群默认使用悲观事务模型。但如果从 3.0.7 版本及之前的创建的集群升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 +> 自 v3.0.8 开始,新创建的 TiDB 集群默认使用悲观事务模型。但如果从 v3.0.7 版本及之前创建的集群升级到 >= v3.0.8 的版本,则不会改变默认的事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 ## 事务模式的修改方法 From 02a01d0ec05250e66d156b1d03343e7dd503b253 Mon Sep 17 00:00:00 2001 From: youjiali1995 Date: Thu, 21 May 2020 19:58:32 +0800 Subject: [PATCH 03/10] address comment Signed-off-by: youjiali1995 --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 3d5a0926cf7d..7975dd1b9890 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -69,7 +69,7 @@ BEGIN /*!90000 PESSIMISTIC */; 1. TiDB 使用 range 作为 WHERE 条件,执行 DML 和 `SELECT FOR UPDATE` 语句时不会阻塞范围内并发的 `INSERT` 语句的执行。 - InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 READ COMMITTED 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 + InnoDB 通过实现 gap lock,支持阻塞 range 内并发的 `INSERT` 语句的执行,其主要目的是为了支持 statement based binlog,因此有些业务会通过将隔离级别降低至 Read Committed 来避免 gap lock 导致的并发性能问题。TiDB 不支持 gap lock,也就不需要付出相应的并发性能的代价。 2. TiDB 不支持 `SELECT LOCK IN SHARE MODE`。 From 33d34e0d51ade7ce74680d1b0b9904cd0a0f9c6e Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:54:00 +0800 Subject: [PATCH 04/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 7975dd1b9890..27c1b694e28f 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -23,7 +23,7 @@ TiDB 提供了 [tidb_txn_mode](/tidb-specific-system-variables.md#tidb_txn_mode) set @@global.tidb_txn_mode = 'pessimistic'; ``` -除此之外,还可以执行如下 SQL 显式开启悲观事务: +除此之外,还可以执行以下 SQL 语句显式地开启悲观事务: {{< copyable "sql" >}} From 1405e7483e69c990a89bfe1a28d76c4000974bd2 Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:54:17 +0800 Subject: [PATCH 05/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 27c1b694e28f..7541f9e47c5f 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -97,7 +97,7 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别: > **注意:** > - > 在这种隔离级别下 DML 会基于已提交的最新数据来执行,行为与 MySQL 相同,但与 TiDB 乐观事务不同,请参考 [与 MySQL 可重复读隔离级别的区别](/transaction-isolation-levels.md#与-mysql-可重复读隔离级别的区别)。 + > 在这种隔离级别下,DML 操作会基于已提交的最新数据来执行,行为与 MySQL 相同,但与 TiDB 乐观事务不同,请参考[与 MySQL 可重复读隔离级别的区别](/transaction-isolation-levels.md#与-mysql-可重复读隔离级别的区别)。 2. 使用 [SET TRANSACTION](/sql-statements/sql-statement-set-transaction.md) 可设置为 [读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 From afb80e38ca01ee135f33027a8880215d2e7504b9 Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:54:34 +0800 Subject: [PATCH 06/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 7541f9e47c5f..b99d77414664 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -107,7 +107,7 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别: ![Pipelined pessimistic lock](/media/pessimistic-transaction-pipelining.png) -该功能默认关闭,可修改 TiKV 配置启用: +该功能默认关闭,可修改 TiKV 配置启用: ```toml [pessimistic-txn] From 44087028bbf06f0edd4d7ff99b245630804984f6 Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:54:52 +0800 Subject: [PATCH 07/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index b99d77414664..8c1ffd036b5b 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -15,7 +15,7 @@ aliases: ['/docs-cn/dev/reference/transactions/transaction-pessimistic/'] ## 事务模式的修改方法 -TiDB 提供了 [tidb_txn_mode](/tidb-specific-system-variables.md#tidb_txn_mode) 系统变量用于设置事务模式,执行下面命令即可使整个集群所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)进入悲观事务模式: +你可以使用 [`tidb_txn_mode`](/tidb-specific-system-variables.md#tidb_txn_mode) 系统变量设置事务模式。执行以下命令,即可使整个集群中所有新创建 session 执行的所有显示事务(即非 autocommit 的事务)进入悲观事务模式: {{< copyable "sql" >}} From 01c0c54d6c330796e169130742d7e9c55a91f9dd Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:55:03 +0800 Subject: [PATCH 08/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index 8c1ffd036b5b..cbb0d292d300 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -99,7 +99,7 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别: > > 在这种隔离级别下,DML 操作会基于已提交的最新数据来执行,行为与 MySQL 相同,但与 TiDB 乐观事务不同,请参考[与 MySQL 可重复读隔离级别的区别](/transaction-isolation-levels.md#与-mysql-可重复读隔离级别的区别)。 -2. 使用 [SET TRANSACTION](/sql-statements/sql-statement-set-transaction.md) 可设置为 [读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 +2. 使用 [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md) 语句可将隔离级别设置为 [读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 ## Pipelined 加锁流程 From 6588bacb62e0b8d3c1bd674deef8c2bf9c6cf231 Mon Sep 17 00:00:00 2001 From: Lei Zhao Date: Mon, 25 May 2020 13:55:15 +0800 Subject: [PATCH 09/10] Update pessimistic-transaction.md Co-authored-by: Lilian Lee --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index cbb0d292d300..bb3375f3e20f 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -103,7 +103,7 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别: ## Pipelined 加锁流程 -加悲观锁需要向 TiKV 写入数据,要经过 raft 提交并 apply 后才能返回,相比于乐观事务,不可避免的会增加部分延迟。为了降低加锁的开销,TiKV 实现了 pipelined 加锁流程:当数据满足加锁要求时,TiKV 立刻通知 TiDB 执行后面的请求,并异步写入悲观锁,从而降低大部分延迟,显著提升悲观事务的性能。但有较低概率悲观锁异步写入失败,可能会导致悲观事务提交失败。 +加悲观锁需要向 TiKV 写入数据,要经过 Raft 提交并 apply 后才能返回,相比于乐观事务,不可避免的会增加部分延迟。为了降低加锁的开销,TiKV 实现了 pipelined 加锁流程:当数据满足加锁要求时,TiKV 立刻通知 TiDB 执行后面的请求,并异步写入悲观锁,从而降低大部分延迟,显著提升悲观事务的性能。但有较低概率悲观锁异步写入失败,可能会导致悲观事务提交失败。 ![Pipelined pessimistic lock](/media/pessimistic-transaction-pipelining.png) From 60a4f5c0a704cddd3748d40d70158e834c4fdda0 Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Tue, 26 May 2020 11:54:36 +0800 Subject: [PATCH 10/10] Update pessimistic-transaction.md --- pessimistic-transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pessimistic-transaction.md b/pessimistic-transaction.md index bb3375f3e20f..7992bc76d6e3 100644 --- a/pessimistic-transaction.md +++ b/pessimistic-transaction.md @@ -99,7 +99,7 @@ TiDB 在悲观事务模式下支持了 2 种隔离级别: > > 在这种隔离级别下,DML 操作会基于已提交的最新数据来执行,行为与 MySQL 相同,但与 TiDB 乐观事务不同,请参考[与 MySQL 可重复读隔离级别的区别](/transaction-isolation-levels.md#与-mysql-可重复读隔离级别的区别)。 -2. 使用 [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md) 语句可将隔离级别设置为 [读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 +2. 使用 [`SET TRANSACTION`](/sql-statements/sql-statement-set-transaction.md) 语句可将隔离级别设置为[读已提交隔离级别 (Read Committed)](/transaction-isolation-levels.md#读已提交隔离级别-read-committed)。 ## Pipelined 加锁流程