From f3105957e0c79e3992fc9feaa66c7ff1054c7599 Mon Sep 17 00:00:00 2001 From: Calvin Weng Date: Thu, 20 Feb 2020 21:20:06 +0800 Subject: [PATCH] *: refactor transaction documents (#2198) * Refactor transaction documents * update transaction-related content * wording * update the content and address comments * address comments * address comment * update other versions * incorporate changes from another PR Co-authored-by: anotherrachel --- dev/TOC.md | 5 +- dev/glossary.md | 25 +- .../best-practices/optimistic-transaction.md | 267 ------------------ .../tidb-server/tidb-specific-variables.md | 4 +- dev/reference/mysql-compatibility.md | 2 +- dev/reference/sql/statements/load-data.md | 2 +- dev/reference/sql/statements/select.md | 2 +- dev/reference/transactions/overview.md | 72 ++++- .../transactions/transaction-isolation.md | 61 +--- .../transactions/transaction-model.md | 46 --- .../transactions/transaction-optimistic.md | 178 ++++++++++++ .../transactions/transaction-pessimistic.md | 8 +- media/{best-practices => }/2pc-in-tidb.png | Bin .../optimistic-transaction-case1.png | Bin 20638 -> 0 bytes .../optimistic-transaction-case2.png | Bin 27242 -> 0 bytes .../optimistic-transaction-table1.png | Bin 176886 -> 0 bytes .../optimistic-transaction-table2.png | Bin 220575 -> 0 bytes .../optimistic-transaction-metric.png | Bin v2.1/TOC.md | 5 +- v2.1/glossary.md | 25 +- .../best-practices/optimistic-transaction.md | 264 ----------------- .../tidb-server/tidb-specific-variables.md | 4 +- v2.1/reference/mysql-compatibility.md | 2 +- v2.1/reference/sql/statements/load-data.md | 2 +- v2.1/reference/sql/statements/select.md | 2 +- v2.1/reference/transactions/overview.md | 72 ++++- .../transactions/transaction-isolation.md | 63 +---- .../transactions/transaction-model.md | 46 --- .../transactions/transaction-optimistic.md | 174 ++++++++++++ v3.0/TOC.md | 5 +- v3.0/glossary.md | 25 +- .../best-practices/optimistic-transaction.md | 264 ----------------- .../tidb-server/tidb-specific-variables.md | 4 +- v3.0/reference/mysql-compatibility.md | 2 +- v3.0/reference/sql/statements/load-data.md | 2 +- v3.0/reference/sql/statements/select.md | 2 +- v3.0/reference/transactions/overview.md | 72 ++++- .../transactions/transaction-isolation.md | 63 +---- .../transactions/transaction-model.md | 46 --- .../transactions/transaction-optimistic.md | 178 ++++++++++++ .../transactions/transaction-pessimistic.md | 8 +- v3.1/TOC.md | 5 +- v3.1/glossary.md | 25 +- .../best-practices/optimistic-transaction.md | 264 ----------------- .../tidb-server/tidb-specific-variables.md | 4 +- v3.1/reference/mysql-compatibility.md | 2 +- v3.1/reference/sql/statements/load-data.md | 2 +- v3.1/reference/sql/statements/select.md | 2 +- v3.1/reference/transactions/overview.md | 72 ++++- .../transactions/transaction-isolation.md | 63 +---- .../transactions/transaction-model.md | 46 --- .../transactions/transaction-optimistic.md | 178 ++++++++++++ .../transactions/transaction-pessimistic.md | 8 +- 53 files changed, 1035 insertions(+), 1638 deletions(-) delete mode 100644 dev/reference/best-practices/optimistic-transaction.md delete mode 100644 dev/reference/transactions/transaction-model.md create mode 100644 dev/reference/transactions/transaction-optimistic.md rename media/{best-practices => }/2pc-in-tidb.png (100%) delete mode 100644 media/best-practices/optimistic-transaction-case1.png delete mode 100644 media/best-practices/optimistic-transaction-case2.png delete mode 100644 media/best-practices/optimistic-transaction-table1.png delete mode 100644 media/best-practices/optimistic-transaction-table2.png rename media/{best-practices => }/optimistic-transaction-metric.png (100%) delete mode 100644 v2.1/reference/best-practices/optimistic-transaction.md delete mode 100644 v2.1/reference/transactions/transaction-model.md create mode 100644 v2.1/reference/transactions/transaction-optimistic.md delete mode 100644 v3.0/reference/best-practices/optimistic-transaction.md delete mode 100644 v3.0/reference/transactions/transaction-model.md create mode 100644 v3.0/reference/transactions/transaction-optimistic.md delete mode 100644 v3.1/reference/best-practices/optimistic-transaction.md delete mode 100644 v3.1/reference/transactions/transaction-model.md create mode 100644 v3.1/reference/transactions/transaction-optimistic.md diff --git a/dev/TOC.md b/dev/TOC.md index 8a16f458af23..01f4f9e814cf 100644 --- a/dev/TOC.md +++ b/dev/TOC.md @@ -235,9 +235,9 @@ - [基于角色的访问控制](/dev/reference/security/role-based-access-control.md) - [TiDB 证书鉴权使用指南](/dev/reference/security/cert-based-authentication.md) + 事务 - - [事务语句](/dev/reference/transactions/overview.md) - - [事务模型](/dev/reference/transactions/transaction-model.md) + - [事务概览](/dev/reference/transactions/overview.md) - [隔离级别](/dev/reference/transactions/transaction-isolation.md) + - [乐观事务](/dev/reference/transactions/transaction-optimistic.md) - [悲观事务](/dev/reference/transactions/transaction-pessimistic.md) + 系统数据库 - [`mysql`](/dev/reference/system-databases/mysql.md) @@ -271,7 +271,6 @@ - [Grafana 监控最佳实践](/dev/reference/best-practices/grafana-monitor.md) - [PD 调度策略最佳实践](/dev/reference/best-practices/pd-scheduling.md) - [海量 Region 集群调优最佳实践](/dev/reference/best-practices/massive-regions.md) - - [乐观锁事务最佳实践](/dev/reference/best-practices/optimistic-transaction.md) + [TiSpark 使用指南](/dev/reference/tispark.md) + TiDB Binlog - [概述](/dev/reference/tidb-binlog/overview.md) diff --git a/dev/glossary.md b/dev/glossary.md index dc91ff18aa8b..3b31e69e5d20 100644 --- a/dev/glossary.md +++ b/dev/glossary.md @@ -1,6 +1,6 @@ --- title: 术语表 -summary: 学习 TiDB 相关术语。 +summary: 了解 TiDB 相关术语。 category: glossary --- @@ -13,29 +13,16 @@ category: glossary ACID 是指数据库管理系统在写入或更新资料的过程中,为保证[事务](#事务)是正确可靠的,所必须具备的四个特性:原子性 (atomicity)、一致性 (consistency)、隔离性(isolation)以及持久性(durability)。 * 原子性 (atomicity) 指一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。TiDB 通过 Primary Key 所在 [Region](#regionpeerraft-group) 的原子性来保证分布式事务的原子性。 - * 一致性 (consistency) 指在事务开始之前和结束以后,数据库的完整性没有被破坏。TiDB 在写入数据之前,会校验数据的一致性,校验通过才会写入内存并返回成功。 - * 隔离性 (isolation) 指数据库允许多个并发事务同时对其数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,主要用于处理并发场景。TiDB 目前只支持一种隔离级别,即可重复读。 - * 持久性 (durability) 指事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。在 TiDB 中,事务一旦提交成功,数据全部持久化存储到 TiKV,此时即使 TiDB 服务器宕机也不会出现数据丢失。 -## B - -### 悲观事务 - -悲观事务假定并发事务会发生冲突,所以每一条 SQL 语句执行后都会检测冲突,只有在确保事务一定能够执行成功后,才开始提交。另有[乐观事务](#乐观事务)。 - ## L ### Leader/Follower/Learner 它们分别对应 [Peer](#regionpeerraft-group) 的三种角色。其中 Leader 负责响应客户端的读写请求;Follower 被动地从 Leader 同步数据,当 Leader 失效时会进行选举产生新的 Leader;Learner 是一种特殊的角色,它只参与同步 raft log 而不参与投票,在目前的实现中只短暂存在于添加副本的中间步骤。 -### 乐观事务 - -乐观事务假定不会发生并发冲突,只有在事务最终提交时才会检测冲突。另有[悲观事务](#悲观事务)。 - ## O ### Operator @@ -86,16 +73,6 @@ Scheduler(调度器)是 PD 中生成调度的组件。PD 中每个调度器 - `hot-region-scheduler`:保持不同节点的读写热点 Region 均衡。 - `evict-leader-{store-id}`:驱逐某个节点的所有 Leader。(常用于滚动升级) -### 事务 - -事务指一系列有限的数据库操作序列。TiDB 中的事务具备 [ACID](#ACID) 四个特性。 - ### Store PD 中的 Store 指的是集群中的存储节点,也就是 tikv-server 实例。Store 与 TiKV 实例是严格一一对应的,即使在同一主机甚至同一块磁盘部署多个 TiKV 实例,这些实例也对会对应不同的 Store。 - -## X - -### 显式事务/隐式事务 - -由事务控制语句定义开始和结束的事务为显式事务。无需定义开始的事务为隐式事务。 \ No newline at end of file diff --git a/dev/reference/best-practices/optimistic-transaction.md b/dev/reference/best-practices/optimistic-transaction.md deleted file mode 100644 index f05a16c5438f..000000000000 --- a/dev/reference/best-practices/optimistic-transaction.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -title: 乐观锁事务最佳实践 -summary: 了解 TiDB 的乐观事务模型。 -category: reference ---- - -# 乐观锁事务最佳实践 - -本文介绍 TiDB 乐观锁机制的实现原理,并通过分析乐观锁在多种场景下的应用为业务提供最佳实践。本文假定你对 [TiDB 的整体架构](/dev/architecture.md#tidb-整体架构)和 [Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型都有一定了解,相关核心概念如下: - -- [ACID](/dev/glossary.md#acid) -- [事务](/dev/glossary.md#事务) -- [乐观事务](/dev/glossary.md#乐观事务) -- [悲观事务](/dev/glossary.md#悲观事务) -- [显式事务/隐式事务](/dev/glossary.md#显式事务隐式事务) - -## 乐观事务原理 - -TiDB 中事务使用两阶段提交,流程如下: - -![TiDB 中的两阶段提交](/media/best-practices/2pc-in-tidb.png) - -1. 客户端开始一个事务。 - - TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 - -2. 客户端发起读请求。 - - a. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 - - b. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 - -3. 客户端发起写请求。 - - TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** - -4. 客户端发起 commit。 - -5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 - - a. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 - - b. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 - - c. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 - - d. TiDB 成功收到所有 prewrite 请求。 - - e. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 - - f. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 - - g. TiDB 收到 f 成功信息。 - -6. TiDB 向客户端返回事务提交成功的信息。 - -7. TiDB 异步清理本次事务遗留的锁信息。 - -## 优缺点分析 - -通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: - -* 实现原理简单,易于理解。 -* 基于单实例事务实现了跨节点事务。 -* 锁管理实现了去中心化。 - -但 TiDB 事务也存在以下缺点: - -* 两阶段提交使网络交互增多。 -* 缺少一个中心化的版本管理服务。 -* 事务数据量过大时易导致内存暴涨。 - -## 事务大小 - -对于 TiDB 乐观事务而言,事务太大或者太小,都会影响事务性能。为了克服上述事务在处理过程中的不足,在实际应用中可以根据事务大小进行针对性处理。 - -### 小事务 - -在自动提交状态 (`autocommit = 1`) 下,下面三条语句各为一个事务: - -```sql -# 使用自动提交的原始版本。 -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -``` - -此时每一条语句都需要经过两阶段提交,频繁的网络交互致使小事务延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句: - -```sql -# 优化后版本。 -START TRANSACTION; -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -COMMIT; -``` - -同理,执行 `INSERT` 语句时,建议使用显式事务。 - -### 大事务 - -通过分析两阶段提交的过程,可以发现单个事务过大时会存在以下问题: - -* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 -* 在第一阶段写入数据耗时增加,与其他事务出现写冲突的概率会指数级增长。 -* 最终导致事务完成提交的耗时增加。 - -TiDB 对事务做了一些限制: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6 MB - -为了使性能达到最优,建议每 100~500 行写入一个事务。 - -TiDB 设置了键值对的总大小不超过 100 MB 默认限制,可以通过配置文件中的配置项 `txn-total-size-limit` 进行修改,最大支持到 10GB。实际的单个事务大小限制还取决于用户的内存,执行大事务时 TiDB 进程的内存消耗大约是事务大小 6 倍以上。 - -## 事务冲突 - -事务的冲突,主要指事务并发执行时对相同的 Key 进行了读写操作。冲突主要有两种形式: - -* 读写冲突:部分事务进行读操作时,有事务在同一时间对相同的 Key 进行写操作。 -* 写写冲突:不同事务同时对相同的 Key 进行写操作。 - -在 TiDB 当前的事务模型下,不会出现读写冲突,所有的读操作都不会被写操作阻塞。 - -对于写写冲突,在 TiDB 的乐观锁机制中,只有在客户端执行 `commit` 时,才会触发两阶段提交并检测是否存在写写冲突。也就是说,在乐观事务下,如果存在写写冲突,只有到事务提交阶段才会暴露出来。相对而言,悲观事务则在执行过程中就会暴露。 - -### 默认冲突行为 - -乐观事务下,默认在最终提交时才会进行冲突检测。当两个事务同时更新同一行数据,即并发事务存在冲突时,不同时间点的执行结果如下: - -![并发事务冲突流程](/media/best-practices/optimistic-transaction-table1.png) - -根据乐观锁检测写写冲突的设定,该实例的执行逻辑分析如下: - -![并发事务冲突逻辑](/media/best-practices/optimistic-transaction-case1.png) - -1. 如上图,事务 A 在时间点 `t1` 开始,事务 B 在 `t2` 开始。 - -2. 事务 A、事务 B 同时更新同一行数据。 - -3. `t4` 时,事务 A 更新 `id = 1` 的同一行数据。 虽然 `t3` 时,事务 B 已经更新了这一行数据,但是乐观事务只有在事务 commit 时才检测冲突,因此 `t4` 的操作执行成功了。 - -4. `t5` 时,事务 B 成功提交,数据落盘。 - -5. `t6` 时,事务 A 尝试提交,检测冲突时发现 `t1` 之后有新的数据写入,因此返回错误,提示客户端重试,事务 A 提交失败。 - -### 重试机制 - -TiDB 中默认使用乐观事务模型,因而在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,对应到上面的实例中,事务 A 在 `t4` 时就会返回错误,提示客户端根据需求去重试。 - -换言之,MySQL 在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。由于 TiDB 使用乐观锁机制造成了两边行为不一致,要兼容 MySQL 的悲观事务行为,需要在客户端修改大量的代码。为了便于广大 MySQL 用户使用,TiDB 提供了重试机制。当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry` 和 `tidb_retry_limit` 开启自动重试: - -```toml -# 用于设置是否禁用自动重试,默认不重试。 -tidb_disable_txn_auto_retry = on -# 用来控制重试次数。只有自动重试启用时该参数才会生效。 -# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 -tidb_retry_limit = 10 -``` - -推荐通过以下两种方式进行参数设置: - -1. Session 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@tidb_disable_txn_auto_retry = off; - set @@tidb_retry_limit = 10; - ``` - -2. Global 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@global.tidb_disable_txn_auto_retry = off; - set @@global.tidb_retry_limit = 10; - ``` - -### 重试的局限性 - -基于重试机制的原理,可将重试过程概括为以下三个步骤: - -1. 重新获取 `start_ts`。 - -2. 重新执行包含写操作的 SQL 语句。 - -3. 两阶段提交。 - -根据第二步,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。这会引发以下问题: - -1. `start_ts` 发生了变更。当前事务中,读到数据的时间与事务真正开始的时间发生了变化。同理,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。 - -2. 当前事务中,如果存在依赖查询结果来更新的语句,结果将变得不可控。 - -以下实例来具体说明了重试的局限性。开启自动重试后,当同时更新同一行数据时,Session A 和 Session B 在不同时间点的执行结果如下: - -![自动重试流程](/media/best-practices/optimistic-transaction-table2.png) - -该实例的执行逻辑分析如下: - -![自动重试逻辑](/media/best-practices/optimistic-transaction-case2.png) - -1. 如图,Session B 在 `t2` 时开始事务 2,`t5` 时提交成功。Session A 的事务 1 在事务 2 之前开始,在事务 2 提交完成后提交。 - -2. 事务 1、事务 2 同时更新同一行数据。 - -3. Session A 提交事务 1 时发现冲突,TiDB 内部重试事务 1。 - - 1. 重新取得新的 `start_ts` 为 `t8’`。 - 2. 重新执行更新语句 `update tidb set name='pd' where id =1 and status=1`。 - 1. 发现当前版本 `t8’` 下并不存在符合条件的语句,不需要更新。 - 2. 没有数据更新,返回上层成功。 - -4. TiDB 认为事务 1 重试成功,返回客户端成功。 - -5. Session A 认为事务执行成功。如果在不存在其他更新,此时查询结果会发现数据与预想的不一致。 - -由上述分析可知,对于重试事务,当事务中更新语句需要依赖查询结果时,会重新取版本号作为 `start_ts`,所以无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 - -因此,如果存在依赖查询结果来更新 SQL 语句的事务,建议不要打开 TiDB 乐观锁的重试机制。 - -### 冲突预检 - -由上文可以知道,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 - -作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: - -* TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 -* TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 - -其中 TiDB 层的冲突检测可以选择关闭,具体配置项如下: - -```toml -# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 -[txn-local-latches] -# 是否开启内存锁,默认为关闭。 -enabled = false -# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 -# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), -# 设置过小会导致变慢,性能下降。(默认为 2048000) -capacity = 2048000 -``` - -配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: - -* `capacity` 值越小,占用内存小,误判概率越大。 -* `capacity` 值越大,占用内存大,误判概率越小。 - -实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 - -相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: - -```toml -# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 -# 每个 Key hash 到不同的 slot。(默认为 2048000) -scheduler-concurrency = 2048000 -``` - -此外,TiKV 支持监控等待 latch 的时间: - -![Scheduler latch wait duration](/media/best-practices/optimistic-transaction-metric.png) - -当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 diff --git a/dev/reference/configuration/tidb-server/tidb-specific-variables.md b/dev/reference/configuration/tidb-server/tidb-specific-variables.md index 500c2f146a45..6717ec68231e 100644 --- a/dev/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/dev/reference/configuration/tidb-server/tidb-specific-variables.md @@ -311,7 +311,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 默认值:10 -这个变量用来设置最多可重试次数,即在一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。 +这个变量用来设置最大重试次数。一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,会根据该变量的设置进行重试。注意当 `tidb_retry_limit = 0` 时,也会禁用自动重试。 ### tidb_disable_txn_auto_retry @@ -325,7 +325,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 `tidb_retry_limit` 的值来决定最大重试次数。 -是否需要禁用自动重试,请参考[事务自动重试及带来的异常](/dev/reference/transactions/transaction-isolation.md#事务自动重试及带来的异常)。 +是否需要禁用自动重试,请参考[重试的局限性](/dev/reference/transactions/transaction-optimistic.md#重试的局限性)。 ### tidb_backoff_weight diff --git a/dev/reference/mysql-compatibility.md b/dev/reference/mysql-compatibility.md index a8620b96bb46..69368f679e95 100644 --- a/dev/reference/mysql-compatibility.md +++ b/dev/reference/mysql-compatibility.md @@ -13,7 +13,7 @@ TiDB 支持 MySQL 传输协议及其绝大多数的语法。这意味着您现 > **注意:** > -> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/dev/reference/security/compatibility.md)及[事务模型](/dev/reference/transactions/transaction-model.md)的兼容信息请查看各自具体页面。 +> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/dev/reference/security/compatibility.md)、[悲观事务模型](/dev/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)的兼容信息请查看各自具体页面。 ## 不支持的特性 diff --git a/dev/reference/sql/statements/load-data.md b/dev/reference/sql/statements/load-data.md index fc0d84b09e99..94a27adaaa63 100644 --- a/dev/reference/sql/statements/load-data.md +++ b/dev/reference/sql/statements/load-data.md @@ -69,4 +69,4 @@ LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikes ## 另请参阅 * [INSERT](/dev/reference/sql/statements/insert.md) -* [Transaction Model](/dev/reference/transactions/transaction-model.md) +* [乐观事务模型](/dev/reference/transactions/transaction-optimistic.md) diff --git a/dev/reference/sql/statements/select.md b/dev/reference/sql/statements/select.md index faff2fb6d6e4..e8b83945c812 100644 --- a/dev/reference/sql/statements/select.md +++ b/dev/reference/sql/statements/select.md @@ -74,7 +74,7 @@ category: reference |`HAVING where_condition` | Having 子句与 Where 子句作用类似,Having 子句可以让过滤 GroupBy 后的各种数据,Where 子句用于在聚合前过滤记录。| |`ORDER BY` | OrderBy 子句用于指定结果排序顺序,可以按照列、表达式或者是 `select_expr` 列表中某个位置的字段进行排序。| |`LIMIT` | Limit 子句用于限制结果条数。Limit 接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是 0),第二个参数指定返回数据的最大条目数。| -|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。TiDB 使用[乐观事务模型](/dev/reference/transactions/transaction-model.md#事务模型)在语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 UPDATE、DELETE 和 SELECT FOR UPDATE。在事务的提交阶段 SELECT FOR UPDATE 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 SELECT FOR UPDATE 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。| +|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。使用[乐观事务模型](/dev/reference/transactions/transaction-optimistic.md)时,语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 `UPDATE`、`DELETE` 和 `SELECT FOR UPDATE`。在事务的提交阶段 `SELECT FOR UPDATE` 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 `SELECT FOR UPDATE` 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。若使用悲观事务,则行为与其他数据库基本相同,不一致之处参考[和 MySQL InnoDB 的差异](/dev/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)。 | |`LOCK IN SHARE MODE` | TiDB 出于兼容性解析这个语法,但是不做任何处理| ## 示例 diff --git a/dev/reference/transactions/overview.md b/dev/reference/transactions/overview.md index f1997839d16f..f0b40f2687b0 100644 --- a/dev/reference/transactions/overview.md +++ b/dev/reference/transactions/overview.md @@ -1,15 +1,16 @@ --- title: TiDB 事务概览 +summary: 了解 TiDB 中的事务。 category: reference --- # TiDB 事务概览 -TiDB 支持完整的分布式事务。本文主要介绍涉及到事务的语句、显式/隐式事务以及事务的隔离级别和惰性检查。 +TiDB 支持完整的分布式事务,提供[乐观事务](/dev/reference/transactions/transaction-optimistic.md)与[悲观事务](/dev/reference/transactions/transaction-pessimistic.md)(TiDB 3.0 中引入)两种事务模型。本文主要介绍涉及到事务的语句、显式/隐式事务、事务的隔离级别和惰性检查,以及事务大小的限制。 -常用的变量包括 `autocommit`、[`tidb_disable_txn_auto_retry`](/dev/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/dev/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 +常用的变量包括 [`autocommit`](#自动提交)、[`tidb_disable_txn_auto_retry`](/dev/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/dev/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 -## 事务常用语句 +## 常用事务语句 ### `BEGIN` 和 `START TRANSACTION` @@ -69,13 +70,11 @@ ROLLBACK; SET autocommit = {0 | 1} ``` -当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态。设置 `autocommit = 0` 时将更改当前 Session 为非自动提交状态。 - -自动提交状态下,每条语句运行后,TiDB 会自动将修改提交到数据库中。非自动提交状态下,通过执行 `COMMIT` 语句来手动提交事务。 +当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态,即每条语句运行后,TiDB 会自动将修改提交到数据库中。设置 `autocommit = 0` 时更改当前 Session 更改为非自动提交状态,通过执行 `COMMIT` 语句来手动提交事务。 > **注意:** > -> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句的时候,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 +> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句时,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 另外,`autocommit` 也是一个系统变量,你可以通过变量赋值语句修改当前 Session 或 Global 的值。 @@ -93,7 +92,7 @@ SET @@GLOBAL.autocommit = {0 | 1}; ## 显式事务和隐式事务 -TiDB 可以显式地使用事务 (`[BEGIN|START TRANSACTION]`/`COMMIT`) 或者隐式地使用事务 (`SET autocommit = 1`)。 +TiDB 可以显式地使用事务(通过 `[BEGIN|START TRANSACTION]`/`COMMIT` 语句定义事务的开始和结束) 或者隐式地使用事务 (`SET autocommit = 1`)。 在自动提交状态下,使用 `[BEGIN|START TRANSACTION]` 语句会显式地开启一个事务,同时也会禁用自动提交,使隐式事务变成显式事务。直到执行 `COMMIT` 或 `ROLLBACK` 语句时才会恢复到此前默认的自动提交状态。 @@ -109,7 +108,7 @@ TiDB **只支持** `SNAPSHOT ISOLATION`,可以通过下面的语句将当前 S SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` -## 事务的惰性检查 +## 惰性检查 TiDB 中,对于普通的 `INSERT` 语句写入的值,会进行惰性检查。惰性检查的含义是,不在 `INSERT` 语句执行时进行唯一约束的检查,而在事务提交时进行唯一约束的检查。 @@ -159,4 +158,57 @@ insert into test values (3); rollback; ``` -以上例子中,第二条语句执行失败。由于调用了 `rollback`,因此事务不会将任何数据写入数据库。 +以上例子中,第二条语句执行失败。由于调用了 `ROLLBACK`,因此事务不会将任何数据写入数据库。 + +## 事务大小 + +对于 TiDB 事务而言,事务太大或太小,都会影响事务的执行效率。 + +### 小事务 + +以如下 query 为例,当 `autocommit = 1` 时,下面三条语句各为一个事务: + +{{< copyable "sql" >}} + +```sql +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +``` + +此时每一条语句都需要经过两阶段提交,频繁的网络交互致使延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句。 + +优化后版本: + +{{< copyable "sql" >}} + +```sql +START TRANSACTION; +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +COMMIT; +``` + +同理,执行 `INSERT` 语句时,建议使用显式事务。 + +> **注意:** +> +> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 + +### 大事务 + +由于 TiDB 两阶段提交的要求,修改数据的单个事务过大时会存在以下问题: + +* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 +* 在第一阶段写入数据耗时增加,与其他事务出现写冲突的概率会指数级增长。 +* 最终导致事务完成提交的耗时增加。 + +因此,TiDB 对事务做了一些限制: + +* 单个事务包含的 SQL 语句不超过 5000 条(默认) +* 每个键值对不超过 6 MB + +为了使性能达到最优,建议每 100~500 行写入一个事务。 + +TiDB 设置了键值对的总大小不超过 100 MB 默认限制,可以通过配置文件中的配置项 `txn-total-size-limit` 进行修改,最大支持到 10GB。实际的单个事务大小限制还取决于用户的内存,执行大事务时 TiDB 进程的内存消耗大约是事务大小 6 倍以上。 \ No newline at end of file diff --git a/dev/reference/transactions/transaction-isolation.md b/dev/reference/transactions/transaction-isolation.md index 9eb3a164dd10..2c64a949fd4b 100644 --- a/dev/reference/transactions/transaction-isolation.md +++ b/dev/reference/transactions/transaction-isolation.md @@ -1,13 +1,14 @@ --- title: TiDB 事务隔离级别 +summary: 了解 TiDB 事务的隔离级别。 category: reference --- # TiDB 事务隔离级别 -事务隔离级别是数据库事务处理的基础,ACID 中 I,即 Isolation,指的就是事务的隔离性。 +事务隔离级别是数据库事务处理的基础,[ACID](/dev/glossary.md#acid) 中的 “I”,即 Isolation,指的就是事务的隔离性。 -SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重复读、串行化。详见下表: +SQL-92 标准定义了 4 种隔离级别:读未提交 (READ UNCOMMITTED)、读已提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。详见下表: | Isolation Level | Dirty Write | Dirty Read | Fuzzy Read | Phantom | | ---------------- | ------------ | ------------ | ------------ | ------------ | @@ -16,13 +17,11 @@ SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重 | REPEATABLE READ | Not Possible | Not possible | Not possible | Possible | | SERIALIZABLE | Not Possible | Not possible | Not possible | Not possible | -TiDB 实现了快照隔离 (Snapshot Isolation) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 +TiDB 实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 > **注意:** > -> 在 TiDB v3.0 的默认设置中,事务的自动重试功能已经关闭。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务自动重试及带来的异常](#事务自动重试及带来的异常)。 - -TiDB 使用 [Percolator 事务模型](https://research.google.com/pubs/pub36726.html),当事务启动时会获取全局读时间戳,事务提交时也会获取全局提交时间戳,并以此确定事务的执行顺序,如果想了解 TiDB 事务模型的实现可以详细阅读以下两篇文章:[TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/),[Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/)。 +> 在 TiDB v3.0 中,事务的自动重试功能默认为禁用状态。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务重试](/dev/reference/transactions/transaction-optimistic.md#重试机制)。 ## 可重复读隔离级别 (Repeatable Read) @@ -45,7 +44,7 @@ commit; | ### 与 ANSI 可重复读隔离级别的区别 -尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的 Snapshot 隔离级别 (SI)。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 +尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的快照隔离级别。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 ### 与 MySQL 可重复读隔离级别的区别 @@ -61,50 +60,6 @@ TiDB 仅在[悲观事务模式](/dev/reference/transactions/transaction-pessimis MySQL 的读已提交隔离级别大部分符合一致性读特性,但其中存在某些特例,如半一致性读 ([semi-consistent read](https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html)),TiDB 没有兼容这个特殊行为。 -## 事务自动重试及带来的异常 - -TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏快照隔离。如果业务可以容忍事务重试导致的异常,或并不关注事务是否以快照隔离级别来执行,则可以开启自动重试。通过设置 `tidb_disable_txn_auto_retry = off` 可开启该项功能。需注意 `tidb_retry_limit` 的值不能为 `0`,否则会禁用自动重试。开启自动重试以后,事务遇到提交出错的可能性会降低。 - -开启自动重试后,显式事务遇到冲突可能会导致最终结果不符合预期。 - -比如下面这两个例子: - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `select balance from t where id = 1;` | `update t set balance = balance -100 where id = 1;` | -| | `update t set balance = balance -100 where id = 2;` | -| // 使用 select 的结果决定后续的逻辑 | `commit;` | -| `if balance > 100 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `update t set balance = balance - 100 where id = 1;` | `delete from t where id = 1;` | -| | `commit;` | -| // 使用 affected_rows 的结果决定后续的逻辑 | | -| `if affected_rows > 0 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -因为 TiDB 自动重试机制会把事务第一次执行的所有语句重新执行一遍,当一个事务里的后续语句是否执行取决于前面语句执行结果的时候,自动重试会违反快照隔离,导致更新丢失。这种情况下,需要在应用层重试整个事务。 - -通过配置 `tidb_disable_txn_auto_retry = on` 变量可以关掉显示事务的重试。 - -{{< copyable "sql" >}} - -```sql -SET GLOBAL tidb_disable_txn_auto_retry = on; -``` - -改变 `tidb_disable_txn_auto_retry` 变量不会影响 `autocommit = 1` 的单语句的隐式事务,因为该语句的自动重试,不会造成丢失更新等异常,即不会破坏事务的隔离性。 - -关掉显式事务重试后,如果出现事务冲突,commit 语句会返回错误,错误信息会包含 `try again later` 这个字符串,应用层可以用来判断遇到的错误是否是可以重试的。 - -如果事务执行过程中包含了应用层的逻辑,建议在应用层添加显式事务的重试,并关闭自动重试。 +## 更多阅读 -`tidb_retry_limit` 变量决定了事务重试的最大次数,默认值为 10,当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。当用户相比于事务隔离性,更关心事务执行的延迟时,可以将它设置为 0,所有冲突的事务都会以最快的方式上报失败给应用层。 +- [TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/) \ No newline at end of file diff --git a/dev/reference/transactions/transaction-model.md b/dev/reference/transactions/transaction-model.md deleted file mode 100644 index 5b72a91d5718..000000000000 --- a/dev/reference/transactions/transaction-model.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: 事务模型 -category: reference ---- - -# 事务模型 - -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 - -## 事务限制 - -由于 TiDB 分布式两阶段提交的要求,修改数据的大事务可能会出现一些问题。因此,TiDB 特意对事务大小设置了一些限制以减少这种影响: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6MB -* 键值对的总大小不超过 100MB - -## 基于事务模型的优化实践 - -由于 TiDB 中的每个事务都需要跟 PD leader 进行两次 round trip,TiDB 中的事务相比于 MySQL 中的事务延迟更高。以如下的 query 为例,用显式事务代替 `autocommit`,可优化该 query 的性能。 - -使用 `autocommit` 的原始版本: - -{{< copyable "sql" >}} - -```sql -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -``` - -优化后的版本: - -{{< copyable "sql" >}} - -```sql -START TRANSACTION; -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -COMMIT; -``` - -> **注意:** -> -> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 diff --git a/dev/reference/transactions/transaction-optimistic.md b/dev/reference/transactions/transaction-optimistic.md new file mode 100644 index 000000000000..19c146e5ec0d --- /dev/null +++ b/dev/reference/transactions/transaction-optimistic.md @@ -0,0 +1,178 @@ +--- +title: TiDB 乐观事务模型 +summary: 了解 TiDB 的乐观事务模型。 +category: reference +aliases: ['/docs-cn/dev/reference/transactions/transaction-model/'] +--- + +# TiDB 乐观事务模型 + +本文介绍 TiDB 乐观事务的原理,以及相关特性。本文假定你对 [TiDB 的整体架构](/dev/architecture.md#tidb-整体架构)、[Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型以及事务的 [ACID 特性](/dev/glossary.md#acid)都有一定了解。 + +TiDB 默认使用乐观事务模型,不会出现读写冲突,所有的读操作都不会被写操作阻塞。对于写写冲突,只有在客户端执行 `COMMIT` 时,才会触发两阶段提交并检测是否存在写写冲突。 + +> **注意:** +> +> 自 v3.0.8 开始,TiDB 默认使用[悲观事务模型](/dev/reference/transactions/transaction-pessimistic.md)。但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 + +## 乐观事务原理 + +TiDB 中事务使用两阶段提交,流程如下: + +![TiDB 中的两阶段提交](/media/2pc-in-tidb.png) + +1. 客户端开始一个事务。 + + TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 + +2. 客户端发起读请求。 + + 1. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 + 2. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 + +3. 客户端发起写请求。 + + TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** + +4. 客户端发起 commit。 + +5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 + + 1. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 + 2. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 + 3. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 + 4. TiDB 收到所有 prewrite 响应且所有 prewrite 都成功。 + 5. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 + 6. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 + 7. TiDB 收到两阶段提交成功的信息。 + +6. TiDB 向客户端返回事务提交成功的信息。 + +7. TiDB 异步清理本次事务遗留的锁信息。 + +## 优缺点分析 + +通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: + +* 实现原理简单,易于理解。 +* 基于单实例事务实现了跨节点事务。 +* 锁管理实现了去中心化。 + +但 TiDB 事务也存在以下缺点: + +* 两阶段提交使网络交互增多。 +* 需要一个中心化的版本管理服务。 +* 事务数据量过大时易导致内存暴涨。 + +实际应用中,你可以[根据事务的大小进行针对性处理](/dev/reference/transactions/overview.md#事务大小),以提高事务的执行效率。 + +## 事务的重试 + +使用乐观事务模型时,在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。为了兼容 MySQL 的悲观事务行为,TiDB 提供了重试机制。 + +### 重试机制 + +当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry = off` 开启自动重试,并通过 `tidb_retry_limit` 设置重试次数: + +```sql +# 设置是否禁用自动重试,默认为 “on”,即不重试。 +tidb_disable_txn_auto_retry = off +# 控制重试次数,默认为 “10”。只有自动重试启用时该参数才会生效。 +# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 +tidb_retry_limit = 10 +``` + +你也可以修改当前 Session 或 Global 的值: + +- Session 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@tidb_retry_limit = 10; + ``` + +- Global 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_retry_limit = 10; + ``` + +> **注意:** +> +> `tidb_retry_limit` 变量决定了事务重试的最大次数。当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。禁用自动重试后,所有冲突的事务都会以最快的方式上报失败信息 (`try again later`) 给应用层。 + +### 重试的局限性 + +TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏[可重复读的隔离级别](/dev/reference/transactions/transaction-isolation.md)。 + +事务重试的局限性与其原理有关。事务重试可概括为以下三个步骤: + +1. 重新获取 `start_ts`。 +2. 重新执行包含写操作的 SQL 语句。 +3. 再次进行两阶段提交。 + +第二步中,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。但是当前事务中读到数据的时间与事务真正开始的时间发生了变化,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。因此,当事务中存在依赖查询结果来更新的语句时,重试将无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 + +如果业务可以容忍事务重试导致的异常,或并不关注事务是否以可重复读的隔离级别来执行,则可以开启自动重试。 + +## 冲突检测 + +乐观事务下,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 + +作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: + +- TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 +- TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 + +其中 TiDB 层的冲突检测可以根据场景需要选择打开或关闭,具体配置项如下: + +```toml +# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 +[txn-local-latches] +# 是否开启内存锁,默认为 false,即不开启。 +enabled = false +# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 +# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), +# 设置过小会导致变慢,性能下降。(默认为 2048000) +capacity = 2048000 +``` + +配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: + +* `capacity` 值越小,占用内存小,误判概率越大。 +* `capacity` 值越大,占用内存大,误判概率越小。 + +实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 + +相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: + +```toml +# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 +# 每个 Key hash 到不同的 slot。(默认为 2048000) +scheduler-concurrency = 2048000 +``` + +此外,TiKV 支持监控等待 latch 的时间: + +![Scheduler latch wait duration](/media/optimistic-transaction-metric.png) + +当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 + +## 更多阅读 + +- [Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/) \ No newline at end of file diff --git a/dev/reference/transactions/transaction-pessimistic.md b/dev/reference/transactions/transaction-pessimistic.md index dcba48a52a52..2bebc1a600e7 100644 --- a/dev/reference/transactions/transaction-pessimistic.md +++ b/dev/reference/transactions/transaction-pessimistic.md @@ -1,12 +1,12 @@ --- -title: TiDB 悲观事务模式 +title: TiDB 悲观事务模型 +summary: 了解 TiDB 的悲观事务模型。 category: reference --- -# TiDB 悲观事务模式 +# TiDB 悲观事务模型 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 -悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +TiDB 的乐观事务模型会导致事务提交时因为冲突而失败。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 ## 悲观事务模式的行为 diff --git a/media/best-practices/2pc-in-tidb.png b/media/2pc-in-tidb.png similarity index 100% rename from media/best-practices/2pc-in-tidb.png rename to media/2pc-in-tidb.png diff --git a/media/best-practices/optimistic-transaction-case1.png b/media/best-practices/optimistic-transaction-case1.png deleted file mode 100644 index 443a6fb6de284d0fa1d7ef730cf1fbab7c10044d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20638 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 Ney=$$bGPG<{|CWaju`*| diff --git a/media/best-practices/optimistic-transaction-case2.png b/media/best-practices/optimistic-transaction-case2.png deleted file mode 100644 index 6651b0199fcc0f10158d12561e4a9dbe8b4594fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27242 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 LS_(OGH}CyFvZhI{ diff --git a/media/best-practices/optimistic-transaction-table1.png b/media/best-practices/optimistic-transaction-table1.png deleted file mode 100644 index 6e19d089fcf467dcab36b3fc179f256fdbb34358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176886 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�K(AIb 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⩔|M0wraysj!+3QfsV5h;zn-NKaMce)70)C_Gr(o?R?nsdy(oa4_7Z^Vw2VO(;`eP9uCRaM{$&Y zoU(a%J&mXaHzo3KNY{l{Aqd362hV1sepi3a(u)jb1@*MbH19U{_1L-yMUKBjT^=h(6!x0s6=z zx(<5OLr!*2Me42GL(&`hDNmmgmZT?RI2x3Kl{bX@R$1D`gR;$c!|$16zo+J!jU<2k zn9F*y-b8a<-LYqGq^oD7b_Qt#H}%88Pj+?ngleZ@0QBI_$UU5Onct__>sY*7n+i35xu26}?%@$4z=f(hqOdV~6(E3sdic zqtP?m0aT~$%h?18ESqH-OB*cXER#_EH_bQqe<;mJgOgL*fh_ZP--dv5rNR{+09<7+&UBPslBrQlU8W@OsMb-aJ)4Q3UNudzDeo`mtw zZe!Z2wcEWF^>-1L(>(kHd$llgLeZ<~>Ylaw@ti#r>mRD=l`XI( zJJWow_GB)^B^7O!sbw8_TQOe&yq%IVwIZh>gIq~P{d*_DOpqyvhKJw;LY|f-ZwO0Y z^~|~wO*wsJ?QzK-$Bm9e|7aSr#^#+$?cHW>eNX#UwMWG;a(Q->c_-na1I;5^0eiE@ zR5#CRP7lI{;>pIw8fMo0tr1BLfaXo!W(KAYzQzzp_BAryZ3_Rvo{!ESp_2Q|CTiCj!w_}ouCKuK5E~e^)39H}Knzh}g_2gWZ*d6d0)ACt!#eJgE^ux!fV zLMAmx0gtve!O<`eR*VjW=hGBL`d8_lVv?LH4<0Fk!uv|7=6lK8`mWP~HNvvl(sT*6 z9ufk{crTskiu#07qM5Z3Ir!nO)S-KZLmSKva*EhDla3ib0bwIH=);@rK1`b5JKrox zd0qF;mlt2zqw9rR*+&T%)26~{ciRN5zKNvlt1x-qy?D5FBt?841i=XfdrA9lL#09$vH=% z0Y!37A}EqXvIGN}CU=u_l&r+2NrD2>L|GVF6}*XW@w_9ALJ-VecnQsGA!# zDR-(0zuM(M&<+a?4wp^9TQCx3j)+>_xRpV5LCW0uZS5lJ?Km7p&a2}-4XTOdJL za+->=m5$@#-850DLQN`{AU(-~_B+VF5Q3INea35f--c}W4 zC;mKyRNmiHcUZd5_2lg;VtXIdUnAWTOwW&J+8F%Z_L18r`yS|-<9+z(5!zS|MXAfG za+*IRcYd$8Dx}_pHppK`qv`Tb%=0~p1`@i1>5YK##W%(>|7aMwCCG`erBP0B4du8H ztUmJCgs<*xCF8rWCN!kb%|W!ah5ptfs2)TVJq{)bl?45aLJ_Dxc;~6az$$!_vtkaC zT?25WZhy&|oybO95?9h~$BEKb*N&DMAo997F0p|JX^+bF2~&l?YF}Y5PAU3D1tsx) zE8Yqx3S&G>IP^#h*(SdiLoayatpGPU?U-Z+T+enL!PJE3GK8h6fMO}Gp-6mG zFt40#ZRpY*;&gbV*3?Fc4gs7DVhF=7tsGfOsFMp+BxIY&E`MiK;fP-Jj{B!-kA#4O zvXbhb+_61uL(R0PoYUmxLN$haS8%NPtH^q#KSdA>H0oovQ}a)lI(lLKc7c2^n>sV6 zIT#=7tm#rFCpz_HjciCkj7Sfi6-2oq6t(LKyd>8{8?!|=`7VtNlVTXGc?Tr=opa?X zLSi}IJ-y?h;|13wYd~GP>kmpzW78;;-G@!G0iX@~K9W3^3!{yuBQ~Ycj*k&0euHr; zdB)sB9i8SV#AXEV(@nPny|pOMe90!z%$2mc<>`(F71uQ2>@f5Qk4WqRfAI=bQ)ni`xK+)zD_Or*xa)(w6fqW{$cr<*>67zotV4d?@wO07!ne5E3?)E@a;iWfP>p?( z8}(`_v)-sJiI@xx+^MSHjF;(d!=(06p^rh7b6-$h z8aR9Nv#LPWHZT>m2Jun@4zzi>j-M5#>h_P_7|TZ$C!PE;ksL}RusQP7YcVBm9=Rl? z6C`{NFB70MoQJaH!yL)wxRXBx4FO3Zh<|aeRVUQ9DF&QQTDx%*uh_@gjcUbs&x}9F zvo>I4_sTlE0-pF3wA>15F*DJki3oyw{;U z{`qRo8JRsE%S-~NpzWz(qJ2D2@Z_USXrM+_YZ1Z69wOZoO5#)=r zIk}|P%r-R>x|^_zRF!jG$WJ3u4US8Hm|6OL*E{7-I~Z)io}*Q#6=642%lt zD~Gk;WnFF0))Qj0Y~b0|-C0PbURK4&9n7Mtm7eUSyNWh}9ci&CoY#f;h|O_TWPT+1 zqR}7a(GU%R4bD>!UogR@)ZAc?8%Fj@EpJ4N|x3p~s&yA-Q! zTS&r#Sx*G3ba#=Xi7@e#7@!_sU%wN>bowL^XLO+*TG8K>ak%}OA>Z8V4s(6Oh4243 zzMmoBdz`YS{Aoct&>Rt%+)_u*GS(guh@0mVU$%yiRD}=xi^gX&kN|X4pLLH#33^zi zfwp;xUP#?aC_!GqRT$xvVbgqYueNg*2SL4ubDF~xF{7_MY7l;54gxBqlhEg|XPsTI z&i|yKVIS*dwD`OEW~dOvP!D%uts(#Okct;fOV>@}GT*Dy{}npWn2vnhF1RV-v-21t zo!+>9t(>A_k(BEUiX9U)p$SK|*A%7nA@revI z%t4Li0nQM1-AX#snh6fe<0YA(_&%NjT}d=1spzm&nc4j^Lmv0 zfR5G~JdYc3G6gKf4$F(eqxDV+IX<5e#jXHC?3mE|U4nsH-w82#ryoX1z7P1ynyK&c z1x4h+s$r-K{c;}4X*)i7I>QrDZTb8h$UDE6lPqo`peW?NBu?_jO1sA1yg|9t?>?G(!gfSVAA z`RyY!bjW`x%ccxG7CF>x&FD*2FV+63gQzTMetzcS)Tem0$%3TuALBat+V4&{?~OaI z0deT#o&eD_*Qr@>XH2hwuKl{%>7ib|Sf4DQW;z4Fghc>w^f?2ua>1k$1vCjlp4kL& z-u!jwJofZ55Kc)IE?4AqiHTL{vHJSr^p@#zwAG?VV>`vJg%U`xy+idQ z@bG7DQgxLZ*p_NFvkn5dS9%JU^#A2k-6;(cScn#zkBFrg1%0$S;L+-{uLT$c31V$f zeigE;Yt%gAh=DZGPJoQ-9H&To249o79g<>Kf#!(>@y``uZ&tS<`E>xgE~)tm0AzEJ zxV|(U3ANW?&gf-w;(EYTBd-EBgz(oI7%Z5qtzMeQbuS4jf12PAYndjd)o+GUcAP=) z+eP;9OHAuFum`Z_vOQ&*GI6f?F$Ki*tb00CyGJ|P!-Cr&ARz4Qe1=4By7E#ZSRvYa zSx@)7oWZkFsY9t6h^?EgiMy)&!YN@38ZYJS`2t&?LbE3nNWtpx^SCHz6U=B6CyTH0 z)vhGhIyY>%Q}$1RO+W$*k^`iSTQg5~IIz&HC511%5y-WbiH@jT7zi3}&1IrqoeaGq ze#-Ti@YCex(CF!U05G~HKqHi+0jsWov;k11C4kXo9XDULeavn%A(gftTXAs;)dd|t zHZiQkEI_wf2eR&WPcH(V34DLftUR5HTo(+BPQQcebtm(_9tuQpzOl01Kn!v@?WjAB z-wy_7Y{@OG{O&8N0uJRv;1uSTS*VyNG^b(hQ$f~&0dc&O(89xWpG-ZMD5S&p-tBa5 zpU(`;P4`$C%7*4*Du?U61fOPPpUM1qtMz8rBT8h{_sP-z7PEwz9FXxS{mboYZTMm-xDkIejQ&MbnI%aK8Az+ZJE#N9WKQvZ z(9m22DGpDTLMie~0-M0c&fW&$<5iGOUG$@ObZ(?JvH$~G(l1S=)klGcT1KnDKwBSs z{EjEWcK+-vaB^`QZUi8FJv_Vyx<(JwP;uK$V7l!L#^{u|6@w;lG|=2&mBy7L7G?Lzb}bO_ z)EQq8*HH#{emqIj1xeDU!DMzZ01Qw#mUdXluWk2BTpW+oRkZiM>)l7u?!a4~L;2jd$BT|0-5 zYV~4ZDT!a;g6)I5*z?(2h*)Wm>urc710-wumlY*9jkd2r4ZiYeP&R70)@A6Qx7)|z zfAg7toA0^`+zc-jXMArWTy|PXhvJXH6PWl|HG7`a@!{A_tw~ay_+6Q-^rB&Y2B(X@ zePF-Koe$0WT(f4^kR#zyA!;Lv7CvAY?hg=G9SwASQlK`BN<6>(k$a1Zoif;zW+->b zK`OeV3P1NR?ch)XfywShu|T_De(;d6Spd5=&8_;))*2JggZ7;UzNVC-Z5!q(NPkd| z^m(;{zNDoR$5TZgWxjFh%4*t)L;0jRFh*6bhYqUwf6bCo{5TD`SL13a9R)Tk59yw- zN{vG2Me%rsn4XBfUXPKQ5k7<=TE9t1hgZeM*iaHodZ(cxxSZF?Kng<8zfn;goseEk zwwfP(@4Nwqj29C9!BXlBg5SuuA#+%PQr?OVm!OwrnnQ>or3wH^%PZv8CXc<<$bD@g zJj%Lj=2WHQo~wvuudATq3imw%4{RO1-8=rNg+_mzt*EPvdd3LhfUoTi?f?|}jC;e! zqtboI{mVYL)*3$gmZ(fZj!iZCpU;xP5I8;Kw0^-lCJk%YHC*P#r=yJJkUhAc_vGEQ zt}xtRPL?MC+y_%&`WokGIrzRolSeZZ zPtfQcu<3aMe@-P1EZl9n|~To^K}rn?iE|Id6+ zRupXHx#MMqk#M6*XmDQAGnv{yLPWbl{&`^i6)Dnnva)G18kRP6`=S_s);{HDD*Wd` z>5^PDI3L%-3&hhWthlr$NXB|4U-CemJZlAyS1^Ux2=OO}<@DZZ+Vgf}(IqNs zDP2od-sy#L*pPIU-Pi;Z_~D4hYp;Usc41>3QBl*(biD?BMD?Ph2V=t?YqdUI>j)K_ z?iPMUffeS^KS&q>Z%}X2UJw>}HJHuw3<2l?xhvIM9<@|1!#H%{ejKa_TTMmXm6p4> zD>d3AVmp(nIF(}%PUeso@Wv3gpJcKo7JT5nGDTWM? z!c7vFSdo$h*n;*k5ywlkZ;o zv>84vT3Nobx}#+l3=eetJWQ{jNYsR|G9PgH_^sA^6IX*QcB~w(9Y0%%^lO19YY`v$ zPN$7b5#N?}*DKJRd!2;#Tm69{LC;&Sz%Fx)7s>w^DF(+RYXd*$wDF4J$G%XdLpX=x zpSKr@$To-7%SfJr$18jo=Qz;1wv(aR8^9SWoneac9&Pq<*{090!PiHd$*W2#Gu^A& z-O|Q4hmp@4naj-F$iVIvNcc?<{K*1v+O{qTCIjlExmMU1KWM}iS!aGo0ZI>1@iD+K zNSoBYuFd0BXw_-+V4l*6@n95Y;-ccOf7@Xs?|W$UzJW$_)m2qi>SdPBb<}}lR)e5y zxa2P;gVO~poY!jdn84$-?o{O+ey~GuM&ad+Ot;@-(0>#FYgab0O{dfLcznXF^_)kB zPaOq-4upeG=R=F36y7l8zK@L0Pk%^JPDo72EHQGB^|TyLLh~yn=e==DsYTm6Dw%M1 z8FU|%Okxqx`uxoOpM<-!qz~Klx_5WoShXq5uEsR&6@R5f<&>nL<@97G*1%!CarH+2 zxC^VlQYkc8(!^|=<{bqgCLZ=$3i?l*j^~tQ6&~QFYzKF5>MWLKQJg@zPw$v)z_H=p z;sSkwTIr2(A9x%t%PQ||aF5P}xyxbg5jYU6_$j$@a%7c!!I^)6j!o$#8N<&IkcdfT z`{Wls%o9}j*9v!pPaGpjyS@tJPM^K_dJ&mULOU|&^$RQiV5vemovIzZ(rS-<{o;Y= zW4wGCU48bq;uAni)OO;NxIjxqn0E3q!C~DM5&S)E)OThc$nk&G5(iW$_-rnPx zClx82u$BxA^s6?Uj20z21aeErr3t(3@L*CPxcjO8tb=s3Oa2`PBX}tfr%5ftCif*`54{6qWn*<5UZ}1y)e~XSDlTU!l(FeKq>o_v*!IXN*@v( zwJQNJo{LLQl{2qm3LiM;b%bh6N&qR=&2YbH5!?N)dNA%ae5brVw~cW z-}QN_k-6pR^zO$_juaDy&HOL4fgQ7?^KYi-RrGNTe&t^W_YW&RAI!J3zdg1Y|KM2R z*jYd#UA_x!&m`~4f5_aX$>b7#f_5xzA<6&Y^Zw0Q$n*au_%V4Bycg1V{MA4(VRkvKhH4DD*_G%=)8RA7?0P zAeTqghI~=jX3#LQ!O6g5vfDp4U7%=m$FF;uq@;YozVte*XAeP()uPWFdmF}?TWx^+ zz`KoamPTptiQ(--LS=*PY-$PNi1O2og6$R?$=6!82LPRx#DKR3pc(hay6D#?^-$Xm zwc`wDZOP%evzHl4v2N_Wzmd7>`-uL_*jvTI97p3_1Jw=xH9et;L@GB4 zoVP|HpG0DY`>Fg(+cuX+Kq#r*uWP6^E`oJWbDDN(ZBJ!;! zMNsyB(-0xW!`;EW#E`yatLhxoXeh9QuPQRhRoI9i*eZ$h z9BV>+X*YN1E5fqzDjzY;fw^}kbI!WmgefS z;TbxzL8cQ*E&RC2I%z7y_jnmSVfqF^--Fz3wIvj6s7AC|ae+)z;}z3%cay<-aDZ;!szI|!jT}`%nixYs-|OJ zgHOJfL^IE1yv@}(6Jgl0wqJ|!CmUn#dYzeIb~I17bzMk^HOWo=0F-6StXY3NWhim@ zYM5zPu%FQ&^eJg&?VF{J)!P=6|MfB91v}HI+a?`z7^MUz-q+jsL6IN&-F*2h7*>j1b>IbCbb zV0XLgID)EJBF}@5X8%=%-NM@Zfzo;?G1{#jj-2G0kxs!9PF>%2p%z&WEzcO;S>+1K z^8gsFYA^^9>g(DK{mraM&U4C5wtQ6@1{{PmgR^REvnVp>}6 z4=Yp$Ul9vb$WMtqHM+!u0Q>M#LvE$i!0pj+nntM*G;oBsh0_Q?vN?o7bxfm_Lh`s7 zZS{`XwC5I%AH^nkar~9;o+q3(Pz+GjMV~YD9yTlQ6&%Ah*qIkVXN^2uBd45KkM}!( zKQyjvmMMNYSYTcwWR~s%Bb`a5rAph~=rx2Y&9#`!cpu3MHLsCrbD~`?Bp!bwmsxI0<5+Hcop;C3Y)LmU zmn04hVA5M}lTbakW=!j@TR^azInp(1Xu{$p5Y#L`eeLSb(FtPDVOVQgG4u5 zBK=q)y$5aIb&eZwFBo*yfDYg4)6dNzpF>Xj9|v*6yiqBKn+l;t%zm3K z_kWVuh@&fF=~NI49mD$ua2=$ALG2c9e0(>W>inWR-`fPfz}~M>CGT|&LidlNb`C(t zQ?;1CghUSXyI_coS@nAX6HpMFeLS4A?Kp{R=JM~XbOtN3V92gKM@E4oBzY(bljn5wUSC`N2Z%%5ADNz zHO<9=evn+P>$>Fp_D>1kUd`**97e5>aupfuHcH%=i?Nw~iTai=H;tjVJekT!!J6%m z%>1ZhiqT*MwyHQ=H%O*9jfbvbLz_zf_zTY9I>FAj2gnXt!g-uC`XtLj|e(e{w7x)(xRoBmD>}dq4rP$Lx){MP1@V#=fX;LID*bk`TpRcM; zGp?0P761<1*PM%^^F<@ox^QOgmdBWlU{V%+Q7a9c@H5u=<|F~`?Mc>?&2a0o47gZc zi2%XarMprqc^_LJ^3H<3P-{K$%S%$V5Y0_T&x9tCTVF?;M4mDKQwx|tq)mm3rSUUe z+fJf1&hDVqA8>p_WJl8;Md(WIf%dfl9jg)poJg@aV_@usOyywPIx`=>u57vaweoG3 zW7@Me+nQ^{|-euZ=A0E&)T-OlnAiOIAlBtiVw-;eKh3N+~aLqSf?8 z{^)%j^*h12)i){n320Df8^p}r0C=dqj%ENoKJGqKU(($r$zAxRQMcHqkd|#k#HG`r z{?Uw|ai_eQqMnkgsTQvq@duuJxiX!h=j}7a+5{Pcw2?VB6%Iy}ckEL9eBe2+B`N2# zWpxwhPRB-0B#X_M#-~Ppvzau%%AvA)UORmPAJp3hd)^He%%L{7wyN${MUIV24GCqZ zO$z*16%eQW8g;b|&Ht(ILTSfbs2fR2Utu*mshhGcflOVw(M8x~pF&`lcs+kfQpV%m z78B_a0;u3FP$5E6$xBg!`Add2$_(}{W5o{A+`dhD`L`+%A65-|?~EgTGQh;vypBd~ zVd?6v4s%HZW{U=-VK1_HOz6ZQ5!?T~W-*l;r4!2AsfvFBk&Gg>)z})tfx711aJU9g zyE&9c+1^-8&L=$HQ2aRfV5Sj~Xu#|Mk0G2*KM1^H)71PJT~RE8jG?pVVOpLupv^$eR|H^<_%+w#_#s5GYuYg|gFqifcZnZX8I2A(vmM+N&uv(`0x*pH~(yR}uFet`%5W za=aC4r~|ATIj^V=wf&wJ%s(Xjq~c#%I!_p&6aK4Z_xt4&*q#msF$b8Ys>m%=0gYL& z2x?%QNOkN0Kl05FML`*u7)lvCO?63ktL1AC)DY(xcmLTa{FR}B%ExraF(suW(`c)u z>=o5HJ-=oVgW}x)wuULKE*wmfl}OELslr36>$7Cyk)K@UFZAq*h?JGgLghSRFimEI z=@j#3lF>OnX6^k{i%CV}dkDj$fM2LMgb2l8 zTKc2Gh?xo*FEelO#J2g5Y$vaUo}&J4n^I8$CSB8*FzfI-^VS zOK2Dm=Vj~jK#JzMe0MN*aB-M51Sr#dCs^? zs_udAO+`1KI-tRc4_2Frj0!1HR1L0k+(hpo@(*L3WC*3j!<~}SR}>h8&E9<2WFo&} zxSi7L9#aQ=I1`JXwONm>2Q#sU;25p4cQbV>W$N=5gsh)Z^}qkdI<4OIC;eAnVdq2o z%TEfaKFp7$SassMwhzsF2NKql>rFgnsQi*w?QnLv!9 zVfCP5yals>p$iC#o}>p{4wf0r1C?`;Sq2?VYT`lWCn7872HFM@#7F z!u${g@@~$n#d$X)gn{Czz>0JKd(*%>YlaoCM(4*X>OFqFwsD>Qo1w}&Z+RV5>06PF zrcI8SVrXsLVM#2y;M^mcSZRO>(@Y5%V^yU|76*V(E(AeIPeA1w#)i!dz@R=O%eB*Nq&ZwS@G5VNq&s#?)%{N`+iIfx`|Z;afZd?JvlmBw6#u>=FLH= z;d-_RrzE<(f%QCJ20J%&qepxxXqc-1s|r^qqnew;GR{3B{b*fW z_iU0>gecYaVd?cWc;On&+?cO1>)D?OB-kEVKkQ5N)zmF7Me~Wq>!XE#8aKKruFD+O zSfGE3M}}f2-wSs2NyZUiJy?Ji=F`u{l@rtnD!(!8eBjmA=;<$+ZAi0^gBtJF3bE(l zo8`scP?mW&?5nI~@>xL9m*jow*9S3PMX zEcwB#)w_dBBjKtD9u>N+_mNO@R3ax4Hy5qdZ!x+sdIW^-tcQ%_IXsh16&NAB)RilR z`6R_8Pciqj%xqQ#k6Y&~dwD8UmVK3@zo49it97dzEDZ{$=4n?t@mpu1O5ZH?0Qq20q|63WVl0-_>P8CxFbNiM#~jaYAjy z>zH}^%60jv0P86kznw3pdF7Q zO-Mgg&mOZ?6Rr@>dLN(!2X?P-(#Eb$xfWxPV!cxi7=n1Ns@}N zS9U+5eH{nU`v&x4^odQ6hQG`<=wo{fv+9 zZljhYIQL4tEo1PQFS*-HwVc?8@qdKz#s{693sa+{v_1F6s{{a8cqjwXN-g>GP3vsm z*R!gE*j^KVbVh=Ush5ibJ$FY<6Ywuf`?wXP^)&i`5t-z!&fZ9H?a#0WRLihwF4Fu6tt&1j(%c3M)YsKywN|97oq?auI(iF>AWUjRk1CGX}K= zmlDo{!smLcWde7#lc`^1BV9yFfE$>&6^8lUAdzI&E^Dtpa z|Im=JI)dq4a6g#R*gc^Q{+ycqap&S+Ct$o_U2655gb;R!zzky2D}L)sD0_iC@MC3* zNexauk;v&mZ5Ir{|IjOhN0f3K@dcG|96R2-c}aq&4qv%=HfMB*;1!|5#^Ko&&h08WBs~KaT`%bwI#3t=4zu-`0~qzYShL&lXzc zYb@@-LClr#fCK9oGtCo9mb+IyYy1aQW`lfl!+GP-)#Hz?BlUiBz>~*0GQ;Cz(EoH_ zzpfYZ-`7N^8(_)mcNRvx^zvV>b6W;plJdL}3W8a_3wdsP9o zWaboX1W{7f$-pej=IfUBTP2;$Z#4y4s-#$;^7TY}i{1XaDqIc=NULiBRs-r+f`J{X zRT^j;A!xoQ;Nt7N^ik5Y3$$vAs=+s?gX#>W+r8;0#WR@$=r9( zdaMm*Uazu%=mqOhAZ7fC1Z|5wtI{yM5G`-4M7Lm<_1%Uv>XMM<4M zMu|KF6GCe;Q(MA%@(D@?q3(3h$EmTSm-eZwgBVC4xn%lROTnMiq?_SDY@G{<-5>Bq zn)w08vNMnwM$?5gTj`N_{b+(5-+{*%v;6JlFoK3dSCGB%0=GY;K=p%Ui{?8kzvXjD za66=zS1#l%Kro+ggPY&lrXdP+V`4F$4bmS7e07w3a%v@-L3;tOs)dB{`LI!}_BoK= ztkQjZoIG7`+$b@}_Y>8b{}Wo0$ca)YK{FxgxwEXR6S$v174HUaDW}nZe{iJ!^~yXD z+BuQVBE87I38qHR=bYgRM+bv}Y9VzHPzdOfF?aAbflb@f$gxauLbc^JA(d3=7`vgZ zw`sa6@g<1JGFIPNkC#ro@31}+OjAomPP;_xSrM+G&c*jpC-|lfP2ou)@yBvpX9?6g z76n1vbzs0IZ94UF8w8dXNG@lEwzArg6@J#iA1N0hMq#FXiT&1U0}gu45_dHx8_gh6 zxg-b@(mHp@)(7cLS+OyJM<3r~pwZ(2xR3W-`)-J z(~-QyBlerFbdS6f!_uMp2Ue+`vyX~ipj{f^A#{2%yy~{Unof^5eA3ETf)g)^?T%?r~{K6cY8g8i2gx$pg!{QaT; zA2Q6rsKE<78BhY3CgKRv*zdopd7!>r&-JJb%=oiIK9f7c>cBfGbvPB^QK!u&A$$$Y zwf%`k;rhWV|AAckwJONU`f$58#;Wu6nID(5v3gh=!2Nm(w7gB=()^f$U{&=#2ovAlZZ+>JS!VsK% zDPDf0oJvLV!r##>?U14H+ih??o%AUYI=G3IodhQ-T2`_F==`+8cWkJ* z6w$bHS_>TTB$TWq%a|uiB$|SZ${YD>fS{iCYLHruS1Z$xa=O4jl6IfXdX(R9=(Z;v zt5@N7X+aszRL2s`z~uhwy0yQZT{MVIA90BR!kz*JD0V8}sr+~dvl<{HrzZ}cMc6ur z9qVeLL=tWHXS>qzDLw2gDP6pOWCkgwkPjQ@cnUnLIni)m8d26yDjEE&5hX{!vQPwB z3bt-s6y6|APpDsNJ1nphaEA6TXhM@OgGQ!8=A@eAVRu?_2QyYOO6+ISa@Ux@!(g?74$y(=feOw39 zc28i$ESChL&}m?O8UAHMPY`s9fyVtdC6mw6Y+-ArE*&&sXd{tg5`t}fPDzzyTNrv} zs$iBul+rCnA`9g|2rMACFB{f7!M#UkbUH1k4zU{>MLACO#@jvTSU_xnM;VlESCA;& zMj*Wep3WNZ;CKrX_dYx{2wK}5c*T43L1(;pI#`35U9y_fT`t7HG0oKA($mSd@ONo2>L%xIW zzh?{isDXCGpn+@7En0PTh>h?ddPNYgO)r@yLZc!mv{Aqh%19}p!xdF*BK$J*moA;v zR?jsc^!pqpdfN&gWtdi=9nv^ovM5W{!|O}EfdfkZuq3XISZ0-np~)R<08I1J?8O14 z$ON08lW}NNhiXd^pbLumA&gs0Gr!Q6sP$tC*HI!~n{%rlMlhg7`JOB99dBst3oP<`O^1V|sw&BJCJ{nNb?aYKap#DeFpsNl6@o*}^|`Ql2ls8_~YL7r|eKr?s? zM*fXn^SUNg+KN&X=gV{W9S?VYo-;0zuUFzC({VkbVJx1SrEK$7 zWex#fG-Q7h>7}p%#&cb<8=0_hp$lN^4vUd~Rr&l@b58f1_n8 zrONWX36R@p?dk6W9JqTf$>)`6`FyWkiZF5?)$wOJY!Pf_Fg=-*iKV`#c86(#XTw6q zqV;)unHT9c9bcv{I7o~24hH(&4^kX(i&N%(p2U!Sw(QmUhnL4MvivNQ@9qi-C1vq4 zf0s~`Y^ecGDqb$OC0K9^u03qUFkmZ%--*ss4BrbP`nRvt2sw`(lEqlL;q$RS*R5o9 zCqH_HztE3^Ol5h|m&+z|oFO?`NGBQ1MtO*zE>jPiE{7#(zW%JymQXvRe13q&iLE#{ zqVlDc*sUvu^6jbZ0R0(QKLmQb?fmUW+VMkliY|A4XnFSE>b|1&vere#=={aV6^!=^ z?E;O<&B~YUKzx2-?L!d{Ln3E9@~UY)_%M14bwTRyj|v}V-7mT_b&uW=?whL_MV6#^ zJ$~>JYhfdC=wjw1SC&Uuj;k zUljGP1+P}GPJ==rk`k|#$(5ItUc+<%)3hvZft!StT>n+0K){<4G&9S4z$E5zferun zS8xt{Gf2&SA?SObLypR{hR`0K*$kxrn3EH1QyqYxc4QVs+*YHdd3Gh_z~5`CrLY)b z$h3l&F=$fjwpAv$Cf>$97|_FeB{pXE44*U%*#IKeMn4m1i%5Fiz4C%n>KvS1DpdG9 z9dj!$TlC{Z_C7qRm)|t<$7)>dRA0cE^~5e;w|uggxNJ}MXk-Fln#=>4pYm>QgR+g| z)r9}9=_o;jxDa*N#)u(xQL zD@egeoVX4n?IG#Daw+;-3jUx0to(N7bic~STl2Gq3Vo)C2|<=FxMzLhL-gLtXyJ0H z6Xg0;``%@7=|YO|db8`v*N1$&7WAcSs0zC%-g1e*F92XYkh@OAxv6_6(#Gg)aIs0< zjm}h>G@49@!t9p{spDU(wnE&vCa#CJr6JJZAjkZ`B$>-GlYUv^bPk%!>B5y0D#~x$` zz_%}1qvYXj2**JM70x-!2PR#+!z1y=i_wn zyCMfLlZ%7o^WmLU&&dQpq4P<=02+d9fmwy%CnKXPdyYCAdS3XJ-)e*itH2Ot(yrr* z&J@f1Wj>He`O=oUi$-<~IqhLoXY^Jn6C7d-u{labBl^uDqNU{KV0!7LaqJabRgFhG z5-Cl;#uU*zjyVDDF2k*%Nd$~;h3y>w^L`;J%}Z}KDP%<4wO)o$PoE#A%lHxTITFUo zxOk`La?`K(4~*ffjXt|Dc^(GZG#Z;YQE=+*P!zx}>^Zdng&umEL^a83G%LM~|IhpX zuirD+_PShfmBCiUcIUMq#RBt9XKjt!>w_#CV{oH)(++!9F-Dl_BqS$|8dE0n>Jb4C ztzlWWo+DYXg%f}^pQF&ve;?(=f202)x;1hKxO4b=G#`yX8K*zefjv@@pqMsf-xG*l zmz^i}fMV`bn&6lB3gLILWugWBDi^D|VpumG9G_*8nh^PRO{6?ttXOScFxQlh?AtpSifCKH1)Cf1l~cMuW<3X^9-ib`ck(t!d(m+mUhJsIYkG6 zdqh4G$J@R(u_~oxYUuU6TJ7OX%+i&CY^JV6zeXm>f4`$E-3Tsu86DDm-xoa7T&T^9 ziFaUR6^TyBcQNx`}oC$~)MMb(w@zC16f?O;5V z{Ty7_U~?cp*(v5~luH-M6Lqp>16inmFzyKcVF-i&2>YgI=8w21moDY~EbnUMmoT9V z;9cljHhoP8sdK$hOF(+7{bIfjD4*;&D2~LvOxg-1GbHU3zTORd{*jZWPINJ3^NPoe zynX<1Z(o>hA*>ZPn)E+=%iu*ULv_{aBV7X)j=%1OKmYRBi$GA+FWxbZC^b50S13|Z z#VZHM{c8elgPkjj&c5g#*UQ8iEb;4W|pi4rsb(qb6Mm>=%oYDm&m}*-<=_0bev-w;syTHbzp+uBCuRlJwv62 z`Au8ehdDM-#Jw2j2uL(?7Uvt2zx!O&&awLBhm1|vyba(pMijm{wrG1n)4_Hwh2~mm zw}B%##WsZAKDV_8WXv9$0?Je0fj`uTe=K7dFeVopo|Q!~x2l;3Gy#b7IvCwGNW9HjfST527WzrIXzLda?Qs!5UT;_3k?Gt4(_yb~j9XqV8T#Fnrfp;t!8I&qX6->r zQ_g*qWM9g@)mGZ30Zim8H7b_lWJZY05$Y+vE;!Xx`tl-2?f!|9ex&BNo3AA1{`^e- zv2THIgA2~6&%qg(xyK0cxhKGt9izBQ?L8Mo@r~Rx2*~)uLb0eIe8MA+!~JWF8F2vF zkQ6$8FDb>|g?D}?}yi9xP z8ka&clBF1w_}c`0cO2(_bTkJOUi5FiI_;AU%Q1ONX>ot#>Mo$Tj9g1iXs7uT~_8hpaW-ou*yDX&R=~|P3(PM zH~4KgI_xnhBW+HJr#oMi>p&B)3n({^r3lX7`UZU1FO^cK5SANil51~!Bn%dse4(H^ zvDd`?zb>0bPb7aPvnl)ffIFec!R*3Y9?leVDi@ZJ9q?isQ1>&n!(`{o;1m=&Zj6=L z38iiIgN$nKqOOtR$+WcBD(+AW1T_O;Z_#j&ozNsd$s;-Tz z*$L;HIhyySCOTg~U(U)*B+6=;Iu-^lsge?kgD(SDW!p8 zo!ig(fWx00nNej|-*zm2`FL^g0zA^MkC*IAo?g$qFY#145AUGQ?XD~K^{iMM+{?DB z?KV~=XfGZpfHQQ-Gu2b-P@d_r|G*WsGT}b0|5hEHf6S4oL7Q4Exp$Y~Cz0E?B8S|o zE9|QTNNRU0eg)rj5vNqT0BYq6ruEd$hHplD^7#j7EK8m}_aYA-C2t1Zn;gmSu?i17 zDDfFAFFgP7b2zsSAc5Mt@RX{f2GS+N_uk+9_TI?r zHTpQ#;sV(*-VN%7EyDLq+akTxu26XV-j=Nfi3Jm_iJJy1hu%^YJhGH|nXnHaWqn!s zXt3w%=dHE|#}pV^Ii-Tn+Y;Upv_#*buH1Tkp0?wKK#-motqRPcjR58)V%}117I-{L zQ5~`U+O=QcY0JU;TX)1hbtn%Mpc!JUikm5z2K6HP%k z-7gF+*&zZmE7iE9xc@wV1Pg&^5cVkY7-1TG@_JRp)Z@3;nn^A0OR-nXh{@kp&?lkk z-HCT%zI}J}rdE#jDu2-~3^fC6E+-YI)s*darl1&WU^_FY%cDOwK}%6jo$?J%5$Y9r zc?jO(3@C?e^8uh!D070y&~rUgKPg)krGUq0H&5pPb=2=nJ$aXb;yNQl8SH~=KnvOR zoBma86+m@C!TU}LO2weaBH>H-kqQJ(vCYs7q`@8DRonrYfNjrv@{^F|)plnv$D352 z{YH{{XAW_EH7abxjbGSHwu&|wyI!~9p}!hC=0Vo1g=V-T`j#BuvR6Qr;F{duzlLrT zT@J0X5G$v-@Hn2x(xvN;T%RV-yHVp8$sd3dHJ=gC^vKxH#}HFgegSW?fCG;&4AO-O zJ^gy0Lx)N8y0&e|zt@WQvbYF#=HTRv+;Mnkg5*j}8>Z%3LK{T6<`b`ID-32xPXp`9 z64+I1Y{Q@L|K=zG6k^*HU=sXXczz|3vsDSS|3#fa3cBMP{wplEESGcWEoYFl3iaQM zwv9o&tYNSHFR8P^!ejbvUC7S)Kmbp>pdffzMCHxDHx0DTo1dM@xzZo-;DUKk>Km^+ zH^hlAsr;k2Aoua&+{Uz$a^JasT>q?5>bY4;_@XAV`=Uj}3tDfK*yBHMnLn5Ae_hO< zMicPa;s5)g?q53>mFmy|Z#itC^!|U;)PH^G_ksxcmj3OX|NYzlw?9TM{yd1EB{hy= zk)8q?w@GV%Br+Oovd+KJE>L&|BAsC{SBU^*_NM*DCIKeaG+3_I0ni@<#e#bRi5f1^ z49erMY$t=Vx$Ex7-x!@>ER6sATN|MWP66^#CQ|4!2oVKC&nW^-(AZNQHbvMP`-HUI zH%7_BLRcTwd8~1<=fZVY>BmD^O3UxvMGioZyawDqDCj(@$RP&g zjMYG;*O?9+5$hmveD?tIczu|H5OF79bW;lib0f!Kis1<`H;=DmO8(n(vHLJ9{mAZD zQ-S<(bR2+{5ouS>yYcv!F}}GdRo@7R*k73++#>o6kW!LlM5WLu(*!Uw*1?kJ0T2c+ zaUl4E>G^FkcL@Ap0^RZ8L^K87$69aK>4;&dYj)6|EPz=gDL)pgxbl1J*lT}xAF>JipbPnQ@83CSHrB{bh zL@MySJOeD&B41FXOhbd%@jA~ZeC?~?cy*n47DTBGn1Dj|cb6BOtV%X~A&M`=C`DVx zt3HUf0hfOrbo#OGE&)(pz%*#ct^la*r7DmwZabzZ9U+zN2;$B+Ej985TxKfmho=DG zcD3W`_iwdu!1`GarILA?n;B5c*9Z_^UW2XG#p_m$=>X~wK*uzfLKf2wz=F-JMxez$ z4f>q<9a>eOzKL&|=_U$?80Bx z>a(@Le9;?2KfewJQ%s#^4=pE3EzT`KaFvE?y@y7i2bKU@`3rs*z0NU#?Ae+$9LTAi z25Smkk5#~2Z9#uBf17;wb2_ngt;xVMbK+9~P!+yJd3G=bENxv7&>BjN+4-<>hl2Ne z4U~Su`?@~w_x1Vw{`lQ)SJ#cg zIbP%WdOYt_9;n$JYjQRrsF&Qw~{U?k_ zwAG_oDAb1wPxsL*_>{Y<4E@U%JL2;g;O~#Hx_wk%%D8g;?2W@#_4+?Yf+iqYHeIc# zBbF&Bb|~OExR!+3I*;DzW@Q?UaYAqnjjhH*3R`_$#)nL))OY7lrAzIdNojQsloUh!Ay^|4p%~DY z&ZOf;(;%$LOwIJh?_qS#8+71_eAz*lliX+zDOn$(^B2aI7s)*gi#E+_}fy=k|4B@+l|Lx&z67#td4?#nWd}>-NCrfdC*m*+B{E6Q?*%3)N5~mK{cB!%>PC_#5R9hunnf~ht0~GW^MB0QjW1DZ1kL$s zepG!U8vxQKY2pOI~}}z8?YdNnpVb) z`TN(+dXX-*Z-*tjC~PB6eB93deiX%l3gqk3N;Zdy+HV@i0v}?B!Nhk(ZX~9#IKGYA?(n z=ukrYfrJ?G)i+Ji?mtwiHD!LNPmntBQhA_(x$g-SyelWFc1JVi4h(d~bDx6S_fKwp z;uhZS(=n>|qbw)z5@afo>7Pl5JUU{ZwaEQTHvx356fYjnEh@5BJODJ%e(A`4(i(Y*x)7KC&a&M{M@g|rv7~b7VyVWLM0LP z>0X?5jcbV5I-Lk^VJVsSw~-)>!_FYq_?r7?@Vp zlRRkvcT?-vK@n!<8CzrD8rr;hH&*A4D*feHdSJ_4Ant`pyi2P8pvT5Wr^8Q1mX#6P zeNw$VUsK#Xf1J@XuTkVVthAmIUZK`1{E#k9y#Qz3Hdd~)VluU+5^dIda{_;pHnVc4 zAYPlnlhk&&J5NGRBI2?0Qtikg;8B@RwDyIo_i^XK^ELq5M2gx3b~p`9GxQZjPu2$xB>}m2Bk*%eP z`P*c=o9LN|TT#(>P#_0`0PXFR<;6NU3ns_2QkE1blW9 zo)fZsRi&ZQYTw&RQe;10ku^1ucxH_ML#`=UK6Z#48#{LxzC$U_df2_<#A4-$Nc%Bi zHdQZ={A=!i`i>u>YBJ^h&Ny*>cRsOeUU^!pj>BQ=xN}&9x#QF9cw>*#-%e4h;&Br~ zxe$Tme)#!L(1M}2H#UDHOCww)gYQGt*luy6C zm5?ad=6DVba^XrFS*hyumG>!Qins`N1H;673eN$FL{O{Xtab)q{J``X+kWMsfA( z-8)R2G^wsMl^vX&EoG}I0(6`6h{E=f8?xxh|>!L>@b2y{@HdjsVe- zO%P7iJXz|2qJITFmlXG*ZVvEj^9O4v^Dqb8+*lQ3zTof&Aq&fa=cPt4a0=T}{= zL(qo_$+U=HGI9UCcYU)!+&{CUU8w zb1d!$`E!VJ_^W>J;NOsK##du1i004Zqcz)=rZ|TtiMNeIr5ob3Gv@6T>Z;;1o>7 z|4eM-2M*ntK0tNHnJ#VFMOC2VzaQo6yk3Lq@4Y}$LdRC8>0^i`KvX#|hldZ`$=%#1@)$~6rV%TPS}$1* zqq<5oruS(>>hj=M>;vD6(gkxg#s7>$TF^KoYFUd+QyDhA_2>$?dEXq+w5_%rjgF`J zKAN=A1RL?iXgCjFL;!j;T4k}Nah{$;todlf8r^!hF)1}#n5P5_9gC$PpVIiGMtF@l zELJac_0<8NQG(331lH@H#aMVdB0F;oX+9VfAB(^aO9pmT<)T^0~yfRYZ<%lvv5l>HlFDn^VJc8r;GB0=4QUgaPMYK!_-X|MeiPyh& zl*01`S8$qhsAE*ffAKfljDhi5S^K2)Ku3H3>=yU2L6?|Yq;&HTqv=Cx-j>Nz{T5r9 zL6=RRrQ`je-@k%nr?oTWBsSJ-$Ov=rVRh7e8swx&rj#y`cI_Qa_`??(nKNLgP8-jyuN5G~aRupuT)^pwPGhI+b`6)Mzf@D=!mSfC{(9Or z#bO4u8x%!qxp2=+3|8;@$n|%tg&$QxC4Z2swc0jZopq6$E)jq6=~_K^z5NlsP;hB^ z2MKtc*l`a{vvy6&n7SOk0OduQA6!7c8%Q+=vP;=X@_F4#^$8=6AK1`1x!>T_yF4z_ z$CYu7Git=N7VIYZ)#ZsEN1=+c5~h98*RqX@wEK*dy~iuw1m;1Ls{&GJ2dWM7tzQ$t z7|O7wAGcki9PQ*j3lFsZ4R#a}uznQ%;f{GlHs#PE z=KE{wwb5+s=Mx%&aaz2$X~MoMS;m58i|8rEH_H_oW(tv!l$^+WGa5d-xn14q!YZ$# z#!GrOJ^Et04w0Iy#zv`$si?DiI;S=6ZM)7f12Gs`XZ()70#%sU)vcV2^Ki%J*vcg|;JCL7uCvGg$hoNrXA5oL|03G9OnGrJ2n9-e zEmR;ralve?u0?6D-6qbaMYfr4P9K(|U!~DM`^i*0pM6>PBTxpcyL+pv8Ns>!C(sw6yYGZ z42H0~kJ#TLn2|ME{?okDr!>Z?h{Nb}kgBdlY3Fiq(ZTk7hpTY;-Q8C-@j|+6h}$4bVP7ae=v{bJl=7osVC5X)$hH#L6fth}5lfr$L)If~#G zH|Uh^G=g@Fc(_89j{-iYdvTbs-3=Fw!lAO+$?`!z0U2dKvOi5!*ubaw97|o5x$CTx zHm~Tw>Ar+_ay4p_&FHBQ5)jVkMR>GR;*)1^l652<)cz#wI}6oly+6|eAi_NQrZ>yGs`+2z=!HI4XcTeFxrTh@W1<(gem{fhR{1o0+evr!d-=smoYaD{PDdtK78hdJds!09tkO_n08RCh- z)6)4!-yM7-eY)T6b+$DYekExq7ENAb?`T4_BU17K!{zP}`t?hp~MuISjs8)j90 zP=aO`wBx1nHd=bAHls4}bi()NcWRSKDqMlcqnC~j+yq=E#Y4o@+ATWVjzt4N%$s)C znfjJ73M8U?9!mKuX4Z^3#h$_Dngr~Yst~GFKH@hx@A!D;lpOS%19VO+kgse(NN>+4nOOl9#~^0v}4V2CFvdsitscK-}`_kyf^w(T|3-pBfsl0_OUEmtT5e* z+u#yx#}Idg^)o4Q-$ya?!1iV#Bgs@<+`;QHrLX|{6?fh5=cKrZ@cS^FSl0wZ+iF;^FJ#gi!3R0bn(c>ADF^d~pHE}0(*8N|6Y0&P zIV&-=%H9haG_572QfI|^PK-=Q{zp?=5(l!#R?J=nDCq~hJc)0m2MS$GPG zSi{^dQ)!gHzwCPB9HXfHJwiNILEQgSsagV9&k(Bk?wTWEESMofiJor!o9RXm!|LtH z7o#oe*An3r#FMh|+vAo&?D0-`9mD#!*z=lPAS~#|W8!AIp~0W}SY+fqPnny-a#Q=m z3SLS{v11N>2;4i>~hagqxAQnbrp;U7-nN{)rGCq$>& zwOtHm_Lc8S>Cw9xdf5!W8Y7s#P?Ss%CIlQzVN6QA3zO>>9~yn9p1C0?05!8k`}IVe z3dsB}SIJ>nTv%Kt%hV!b26YF1@d(jDY^%ygL03zLwk6oWhKD=QURlAgq>O`c6Kxuk z^9`t_d5|D2bT%csb9YFb!eRVYm*r@MSkuP7Q07u?fVRzob`312K6yF$ABW!xI{ZxW z&f)lLnJQP+O#LOjs5yl2?B#`6I<&Mk?hd@KQBuEq`cVvDi?vqu^l5!aeaDW%{Z4B) zql_w23W(rG2s>A}O#;m<-66^(%uW0%?t+PkQjlVNSK8>JZk`NQWDkVR*ov$GLQGXt zaTD^n)B#{M!XIde#mvw{+-FZ&!d?SjL5T?Vz)DfP#(avw{};$GauZo_NH^vk*&p0n z6uQp2fp(r07Sj;PT7Fe}?ByhHB4(AOx`B)nBCQofJD&f0UGgv{@W$ZRW*skeU2c9L zVM*;*OEbdAQt%eJsClLTDLtJ#8S;%|)JU-x2ySqabmsnP7yTkTk+-CmIrc~vqgEJB zQCcA9zNkL!Z|D#=8J9?L`06>9N$piZ-a#C}G*v6XWh@bW_M;{2yMb+C*_}TII~g+j z9Az(;bBqvdh>Hr*m~nGvi*9&mtWTA;j<#2noFe;{ys1|t0*5n~5b^(fQjicup;fLt zeZXPG6A(1DUZ_CPrV(t5Q@%&a!b$jZsM1? z&G2EI#FN_Pe}fVU*&8x(lD+}u^tyc^=r#to3#KK|iAS}kAuSx$W0mt7D*o_4#x(2z zj)_kF>{=9|tz3LXRK9r*hZn|AGU@q5VK|i8z_nYy z*3=wuBE2xeaCYu%_ANA;KuvzVFNR17e7@)>GBOjmv4O4^0l^MOfyi37thXgZ7y{T0 z%-cGyT@-00j#+_$Aa_Lr+^^o!U0JK1=y#}eW2Kw3O(Ti1sa79OYHzh8lfp7e!bvYEGVIX?xPzx$)!elWXQl(MKSfKpY(^<@Xlw8G3voAIJ zk%bdOek?p?wC`|C2jlj~9B>z@3g}1?wY&Q?iOtm!?5^FtPoL2I$NA(5O^>vG-OOj8 zxuNa8g2Y5G`mE9lM)P~v6Rv{oBPmW)h)+M##;-Mv$R?pHr&;(W)7pGP(jzMU8uHVSrTI`wiXQHV zDV0FAC!M5WMzh$(*h4Cgnr=-Rsm1uoe{*U;7mss@Rh9Izr@U~ZX*HeZLn_qZk9ar` z+blEvtrbX1!TIfCkGw#&ct_YL-blQOSNa-9NvaI9VK*%6^(cu=gVBh> z1QwzRW977@DJ?Dl; zgu&P&EjGkOVE9MYy9zMNVKSTHa7JpSOJ^tn_R=dIu2G7pth~kJQjPkn|CsEatK1Nn zk*RH8Yicw?_&)ulo(=!q1moNBry};0%%%~zR ziuut`+i3(NY$@QG3xIsg`-|Fh9vvZfsKP)Qflwq<8r7R8pC3x7Zag?{p2}7h#v^oR zsIXu(dGHkUgioonJ&Ke1GiC=vUSXqHMjmtM4t9EhCmoV|P_kN6~dr z%f6t|fPtKJnJaUNxe-)SFfP~qyp)=bmJdxWrFy&j2M~d++*TCXeR3dn&&`55h;@0_ zzZ}oOvFlmrch+B03`?CeZ7nl-S}CK$CaHQIOmdjqE-iYDd3VcbV#NM1Q$u~7Tf(vg zW~qymZ{{mixsU|L6HCC~&c6EcfCgufHVJ}~6or0{w+8qrUx$M3xe!b8wo7k~B{Sa% z7Z2)P1PmvQPBQ*`!KuCrL|WOl$U3Z~BS~}V@}1h9{rOPwuLQjL{uw4kKEx_y24cF= zA6~6l%rswdmT&1>J=g*}{k=;OkwTbem>3D-GxOuzmo&k*wjggsaXYDn<-7Y+ItD3` z;}Xq*R!1ywwJqrbs-m@o58lNc-FNQSUs?b!e8B(b z3m+4g0N1bV*BHY@{1MLr@~&VP@s=8P8i$s@cHHx_x-pi#p~B`O?f{L zfPH=-6Hx$;?m{!i#elq*|FvK$siQT#xp5lHX-M@VADPtTdNDT;7enyxyZ_AqL~o-4 zNu-5vy5~_wXB!#N@Py#Ujk_ci>v>E?RJt$Bx?Msg3GcEXvZm$N$*rG8*PE&L5mAc+ zcbGU9_>pRf+!-%{4sgdE7^iZee=N24C1<|>5FP;t?K7n3-6zE?0JT=4iWYA>@d)!Q08A_AApj{96IyZdcor8RONooAJqHDL&BkY-R_41b5UQ^* zYtpwYG6(P4><*L={3^0fHvF&G3dRrQZ=)j5An{ZU&XWArMD{HyfmRE8UFfCZR6vat z@upYy-{12F1<}f=C57>I)8WuMHj^g{J_{KN%No-~5U+cBub+@&oTcZ)LU2yWdk^{C$sTDI1| zyp3E3umR8eYu=yS10c;3z}Sp-6HgA-S0StCx?x|zunwporv6h!=E&+&pFM5=Htv(` zZr1O!9*{g|N)a*$fXQtmQ`?u7p4BROp4_|^;2r*{OoFJJ5&6d;%eVe&iut{Ck*U_R zy}m7AwR{Y<{P_Xq-2Vbp+I|CV#XbI(ofts9_t>hV~-s;a{vZTU;DL$4LuK|d3 zd>pS0DF@*ijyPfXd(EvqP{v z?)qqn)FgEV#IH+%%|73!lxg{;XHqkezJ0DzMVlyZ z(MDM+{WN0n2_V(|=Ipm~VnqdK9cWkPz^@yweEvh%%GtMd7b;8BedY*tqj^F~9Cf6@ z*0%*;pxueA=w3B+w0v(+^GtA=i^tD81L&=-OV>J9tU z1n9)Ox2~O~)DqmBny>|a*UyCql@u$l7(vpSy|wdHii>+f5Xg|wu;?Yt?{{~!Xqp99 zdK%QIFA8M?xeis;cXDcNRF7e*izLXcj+S_}4XMAV~<-?I`{QIvryO6R7H`Z? z;8Lo{sx{D_g(e)3^y-x@kG>AYtZV_rtou%41SF@USS|ro_qTQM58dp+m+T`Kfb6mc zD)Ts-q1B)AYnnQ&QL8z33~*j}-rB?ACx@;rYA>##Ne9E<&I;BSct76pbuu6~ol0wr z9)$Q2uM#9cO3bWQw&rE`S>SW}p(iHt+#A{U!gtnloLswY-484~-k?+~{l@RJ{qy5a zR)*$VaV+$oxOc&g#yHDbivxQJl_9znK;ln}^_sB=Xn^4tOU!64`2x3!J@o>K9~7sW z(x5Y^KQ=4qV$$!S4O@M!>9`wEA*wuoaPll{{1;@&VK8%+;1@GtTcOYVfSy}yei9!R zbCsquf_%SWw#nNY)Ka=d|IrWD%Ky~j+SB1BHQs*1LDc*0a8CI^JlU564tJ-KXxon< z%*8B~#2UsW(Kd^iWk;QjllaXQXBETF4^a)U3O)6bFUMPV~#ke zQVnTQ)-zU93_F}}xeJtEws$%H=NYLN5B3@Yx1x^YZU=wGT<5c>eVvZO8Fs8EgU=t$ z$#OwU*}elRPc_d9=1F%6d`x-B@F`1KNeSdwzumq&)3KDGjBLw4p?ZVyli61yxKRFLQoNtU>wP1?GC{Q@`zmPUiHCxS_rC^riExjXWgtF*c3n3LH+H~lM znWvf`rGV|UxhX-7jvN$bySx;~OlHnwhp}F~E067`C5NBP4K7^ecx->G`8HgRwm;S+ zI4rny^NRCjjH^>>Pud3{b(|3cJC*YogqVDvDIlaBFB!q_cw_^%}0NbbG<5 zTarq&JIvDjqeL%sqRMfvFi=&Aac~2!^qVr%8*xi%fMR)h-%2sVDSgGgX!Ru)3wmqJ zRM=)pOg`+WRI5p2oPItxM0Qoc%tv&3V+0>$u3U@ttr5SoeqHI&(qo?P3V%n=GUBj( z>Ck*3lh9Yfi-w8e$!hFT0eK~9jcC(1;|%UjBN$$EkQ1}%ksz7sQelYu6e%%X^*%r+ z5hof=l*(srOtces3gXJMWN+#7%dT5oBORxA%Ubj4uCUi1pUZ-pbY{%0Vxqlcj|xqV zJ~o%zj=*BRL<;jUcC-8G+r{A`H+{?Gy#0c5bVSA(4%}TQSJ|5z_DxF9v65oqkq1|a zk=@c^w+m9+nCDh}wAJLpd_jr^<(T-*Go>N-HJMS7GFvTic2_MXp&re@4{r0H2Y1hP zy~SW2wJ!BW=W`Y$4b9<}nW_e<^KzpAZbPgTps;+ysw(NttO4nk0#4ukGdLl?hwQkT%@XAi9`ubs3v`J zR}l`^%svElUSY5(MXE}!-Z$|FTks|p61DZBTl`bqO!{>hR(BN`(3Vpksw~_*qhQv_ z&|~m?XjO&>GoVge0F)?&57_jyU(!AeUKLY^XV9wae*0lJDLa*~hG5X8+)W{y@I)|=zkaFKH2$)TP zorpD;8UF_Rhl8Thysy=PZe;Ej2j)8;eXqfvIj}Q!m#sblgJ7iWMnG&WNa;yUB(#zr zDCzZw%Ip2q8{4wgw>N$<5%KI(=JukJC zQg>W(kEXu3+DF@f4IKFl#zNe7i=MdkIQc|R-Q0t4#+&Hw&OY`90pV2(@7bE~#~Ikm z@wT%~L?5!3;M4QZR*3>FxnR9updpQNnx(lr`1b0vmo~hAJr3=W&_v^NTz4>cZKw8t zS&x5p5QuR}^@aFPUj=0j`j!%M;v=Fgu$LG@%4F6jS^ZwB4%P64kaQ!y#&r5-0>1%V zEqAQ4v1_#r!H`94_bTps%pSN0+MIjh>Qk{?C-$62C5i)r;NmZru&ILC*7(ajt9F@U zSbUkuivKvS&bcLgw=jsK3bhH$h(1MOl0Iu{Gb0sHZd$fWMley)GS^g5p=L}odd^z3 z?XAhW>WoowjU}qbWivyNK9-IrCliqPeF#_67MH2W2#U7j2}bd>gi?C9-ym0KLRidE zF!s(0!Ip7pq@S>Cm~X{+_Dt-hrUJw@SKaAHSH~H~EiC)L*N@chxalmJpgu@2&JNxX zqY9chEVb#bFwl{|N}Xjg9bb1yN^ZuvpF>k6cIMVH3cR*C;*6hKFhdFljfP4G3QF;@ zf9?O?1QG#6;G}^8<<2Yh5kD7fS*xk>_T&TPMu4RCMs5`ijaOT={e0Eck`P+`iI4fS zftD8|TfPTtFAD^-{)jvW+bNmc=l0`euh+kR2$JIqxedt(dCi~F;>xq7OteDvYu-Ev zIcl2@cWq5FE$v1i;t|P3sc~%RsND^NFHWvQLJnmPMf)Dqv}zXQff3_#=bZ)feUTx} z^qmGr+iJ0_uyq&e!Ngs^9G08ztc_yUEws;vwnG}CmR*2!aQBp_-ch0sxLd=X6o&cV z;jGl4Bl`i1hIw*=Gcz;_EZ_9QvfLpBFXVDAsJg{R?*2Zd=b!tSZNEL&!agMjLda&` zsD_%?xy)t|O>$ep^5BiwKsfvZ|3=0ij2x}o^<;+O(f}i{2YzddncC&J(yn-o8kIN3UL;xI;wtYy88-*hejv5nuOVr5iHd zPR(Tjf8h*6<@i%MMFSpX%6O8+Ep@u*aV4!c z?+fJvF*yuv$X#p80r%J4GzOh4va-|yA;!!MW4EQ&v)^T<^(<5E;aHJcQ_7&JdLp`7 zp4_cqe47j3{}3z&i46*QFV%2&4Qj|b984g)OX&5InW2B)=gLe>v%eL;+5`=oKQ%+DfbLG z;lqzZDy$`%?nT%Qf-r899i7_PH{6N=CqM5Q()t|wUJ(vuDSOp&L3Hh@7&{{8hfg)8 z!lVE1`BVE(d6$UmVKOg(h;DPtIPu~6Q>|RG1k2VBFJYsHaX7yx#{(<6@)wNozxYOJ z7cW;bpzd*VYvEvP%foS;39PD71o*71^t(^0`b7hiYYPkt-KPhiJ^x(kSf5i0GC}Yk zMIDMo6wO7R? zVkM)}i?Mq9cz_3Ny`+VS>*n#4ogqce&0h>i&X6j!-V-x&K6flDrRRq{cGKpX?<+qE zS_wPY7X7#`?LyhJ+%y0dlfAWWWiXi2YcT>E_}m++Ipbd zrpm^C%x{h60hXQDr=VE(wOj-{>&Tbxim?z`Bb&^l4+Ymj)KH{c#YBp(f5q;jo+02h zQ_Pt7bZJHrxXdq7i9*W)P7kB~H|&*$qf8yi-Bqlj;2HGkl`Lgbgo{N*kPa=a#NI4M z9|5lXWe7cWMg9((s7^sE6`Jt| ziIcI^zElGq;dQ+ZhFworU@9ul;(uBT?XoTJH#fpxf zaI?eZ*VZgtLFjq@*XqXQ6%EAeqX~e>vse?_=;SJHgIWdGZAR86#QsRFY`h0nDgXeT z-Ve~wWW`5iW`WEN3;1tzIvC%PU)*C;yPNU=c}c~PZ2tIm`tnEuY)?~;fwYkO%2g{yRfO-4JUH<#5ru;= zCi&6g7X}JD;!v8}_LOLXItaGwdY0I*5W&jFU`rZzC+A)nf^n(G`nLGa_tC-^j|`g! ztdp=qkSWjw_-3nxgEoNVk$l`p>7_T#>V(*n6jN2nl6p?DGUFnSy}i-bz}x_rT9jZP zP7B@%0!6()%3dVmaKC;ToEUQ~!ZFiIv{H|{M9A7`*?(Zs$+Or%f-SC4LL7O<2>4t6T6Ij2l{MZC*{vaK= z-JGei+?CY|-gobrn^niAToK<1PE`hg*>S-6DtJ;oF-fAX1p&BM8LCDkz0&I}%?N+M z_Ib)))Fx;w{hWH&@=&YzZO=xmsIXdU4`%&3osj2O?~REsw=*8|BM%qCxz)c`f2GY< z{pV>CyfQRpk>nF75*pl(`0Zog$AsFCt7OnQ96{}Ni1^U#Wu5Odlo5#pN{Ca7(PUM| zmNQS4ODNjf{sNkShqk_7`KCJg`^EhOQPUO6&l&XPo?TkK03N(>o+#}i7?jB12Ge^`Vq~`&!jN;hGNVq)vD#Ea`8-LPqhZU)|dt|ZyYNs z;0isW1z?|QL#Yv; zZ3`3*>4$5BfPA}2Ieu=`WB%*XGS2@nz^@?&_)u%;9bp?&GwNh-eDEW*)k2JR5Ld_o zgV(UyP#a)#pWADgV$y1IzC%SMmkFQ4r8Os7YfV!I%u$HHs5x{`k^(g8r_d)SQ(=<)Ww%T! zF)mRMyvV#Dx7UtIv&az9I)fiKo1>;Rr&Du*^~pGc{m{vZj-`+*JLDaDYo&+)7jbM| z^3vq0r~76#XFoaScaq*^0-}9i^A0#&7kig~#P{f95>?9Guo_sceIH5p?osjPbr-@@ zFP)S$0|(E8RC@NSm|y_s2w@kLAlvnMfJ>K5hPSYN#AQjEycGhB2JBY391Fw!s#uB~ zG4qr{gZxL;XJ0$1Zf|<<>o!j#-j||jBO8KK@WEa?lQFtoZ~MkGPB9#Dr5eQPnAa09 zzBpHZxv3N=l3B-e1sNYr=#M*&t)z8b3ZZ|})%kT5F5Q#kU(X;H(O{M3A!jVCklItZ zWq~QbEOy3$!`~c?Yuv|jKC!#}mQ6&|CQPa-m2s2Ez z7`-*!Kcz-ji$}WFSu9%&V|Zi`+Y(&0Ht+v!A6=Tf6A^n#5zhNOvRLH3!$Dvty2P$> z#l}qN%Cu2twT1K#K!JQV$osQ;b=?hXYPVeUHe9gKY)hfTOj>&%IO$Wb<8l{d!C<3juiR+V1c-;=~z|vS; z3LAodn9@v{d)czBmC%|j* zJ$M`ybPZ4c%MYH`+^8BI7)I@x9%c=i{%LJB=sZq0suGkV!W%K9L;1jv|51vzqwtv& zDDHGKfld3f?8?cMm7;MN57-4YbJ&cj>zv)Q7*xk0=eANDQymMTjHrpw+xnKrr;D>} zF~MdWRpYh8^;s`RyU-ZgI(yCf_{G=jOIWY1nFaw%o3k7?6B~UQ%*9^6E)LGsncM2B z_vJEzQdpXsUD$`vQ_2!iZXdr#e&rzsxT%SedfnYQe z5=?Y|Gt-=yqR`666l?MWB;T?|N^rdsT_jjF-B^bpla?ixtS^jlVo<}T+re}kqY!XrkeIq4- zLfs}y`m6m3sP_Oog#K2sObC$#$!UFV0~Pa3VZ_nLYvr2v!Txdv;6xjZPk!9< zGBK&YrF6rK>Ry-M04cM{6G7SC)F+UDVy~h6Pa<-zrO7h&4h+i{xc8I3&fyp93#Za& z8**m8EU_igxAH`{-oIKfbtt$wjzz^wuUtX$Jdh9)W{3>0 zTFLPEe3SVTh=vGz|C9}XQEK zu0EhxU>K~dwnNUe`e!fjhJ|#RcY7FR{WcX#T|Dvmb>I`;wY1|OF&}Fu6$rLHur?nk zN#)=Fy`jUsnAMA+*k?%xY;reW|DgvpfPop`amno{ryZj!=>9#_kE#U+WsRyOfFOZC zzxNG_8Y0KneaELKCDq|A7S!>PfBn$EfBJuX@EB0c>9lmQ|Fb~-i*^6c|Esi610LGd zIBbdgFEHsJ=N0<&X$GLsSMa;6{~nb8j}P=*A)bAjegXYIzw3Xzn}7c$7eCFxma4iKv2B2 z4!`!ynwD70ed${gt|0wnjU-%+HX&m6f1iU=nSAiF2Do3_52oxJ21P~K^^eL_E&>mUP*urt9}c& zQmVN;vL8KYTbP%;*Wv1)ar(c{66yuG=4yRreXzWG)K7s(wyV9*3&5^F=R)ZXKkFZX zpa#-BsNO!&_6&HU6}J-7a4zhixLXH)ys@N!-q)GI*>AQ zLIMIz>81x$(VzC5_J2kkcc2$b)LDOnWD}ly4vWRBymY zl)rBTf`KNG5>lM@=<&EdHx)eZ+O`3_?tx>P4g3GP zAfFoDnGgDHs`&2()gv+tfEk?tbhQe;MTg z(84%BAkAR6#qt&>Xo3#9(aZc(av{2kfVv+=-<4>8SrgqANa9v z_@5;B0{5TEN=-HS@}|Kcxkq0F<4|p4!tqldDAK~ubq%~pn8fdD=fcfF<=-1r+l-eJ z)*ml$fzXt#RmGDo|E;N-;w&wYnCXg(oGT)^sB^yT_gm}{0{pfHHTpL z4Y{X!2I(^R(}Pm8{>czQ&T5pXQKn|fF7_FYuVdEy@T7hzo)p!~f23gx7QOAn_W|Fr z@syr*AZ$M*s;F=oG*_&-nX6rws^1k)?tKpD zXnssMtof#tO2u3s{q6#^Cwzq2vVI-$mFT9Qe{F9w(Q)Mo@TIq>ONu50pf7p<7{2-t z_|>(zU$49(+P+V%{5r0JMNo4QNH=zo7ziX%%ye)petDsPFS-0<(R!J#=tm(bMH&jIzgM&s)eETII2r5|{Fukur(Uv~$YxS0_*~J?S zym#XTLMu90WosQz{5L9k)TCrxq+stg*vNexqHW^kyDdkc@Dh=x@2Q(YA{U}C$1f|) zb{YEj$2rR9CU+dgx+V@UJtAa(lE^CKn1m9|1xuSDl*e@ptaF@XZ0bi8wu@oSFip0~ z{SVn{db|qr6o282e?6fSRbu&o%1y&ki6RqU@Cpu*ItjK7-MutcYi3}ZPtNUjkS@Zo){1J zUi>I$s;V7kWwKo#2+J8SHWvE@9>WT|a|h?D_Vi+w&|rG}*!1_CXC%!aCofQ6f@oB5 zE&IL61M|lpufo|`jquLj0~AfExqY8h0Z-_q(5dj=ydw)a13vJ9Gm0rY% z3wR#vBaEC1L>_LpUS6gfl6xZ+LsLgzzd+2JCXpwM8@X22!2+i~{ zE^({a#MS#k{M5FJt4Fju)ewt-{mY(gbcoTpH;{ zYswJ0n8?T*odb2h*sp@qN8ytv7pC@spI7Ix{ZjBHim0jvU2xm?g4=$mcedQ;@7vx; z1-k7+Vkbg$xf`aQ_um8|n=0#9am0+6V1^ZKM%SRq3bp^&-j#<#y}o^98I5I-p{yfO zS>l9bDLdJcYA8EltdS$b*qb4{P9-5*i;ghH7)@Ckd)ZRiLKuz`%Gg4Z_nF@6>X*5G zf4={`$6s@KzVm#axu5M`KKJJaXiL1<%fNAPRjr68s`KE@65O*Oe9pCh`f1um&jPJ) z2@v^`F)JSnywFpLkeL-~Gv@70PZ@aeU&6!!#TpsEf%tBdYiIz)Zs40aUChyYRbZXK zaW|v>6Nn^2N6Kx{itS2@s`3<%&M^JPq{?g0=7eM$9QR5o+tPUxZ_xZZ7hFl=L$uW9 zBk-1!7*Ie*^*x<8;U#Hl4V-NpM+om8hS?q=rssPu3z(!eRE4#%BJhyz3q~21Ybi?DWKf-#Nq@&J+Jyp)G z{0U^})8YfTRYchh!c#Pp%DDiS0--m2FgK}It@l%c5pgiN^(K7V>+MvCn01%$UYzY0 zETk;XN&q>~5@^?7ho%UtoMU@?w@cg4jP7CfgS-y}%Ge{2**xG$)k0jD(D2G}r}cMB zhpM9_1~M?pE)2;v)c~~GFT4Mi=Nlu=9H61_u*h-|{P-RUHsrSKCE1pYaVo2KmV{7& z+d^otuL4F?NyQ6FTse=UsDCXJ!~wu5@(Ef*%N+3%k@{Zbd=0fang+ZXvOXasiAU0B^^4V;p2nqm9I zx8@UBirx@WZ|&;wBRdmKQSAMI5WO7FIdg3L0UMI{xD&Bi8V;((Y(8!#`LSzZ_)!O0$Bsefn&`YY zbh5&)HB_<0=dDhF;+%F^1CEJBvDpE^*te#NMQD6&RfOZ%dR;L(k+#6@&jY66K1H!a!8wL9`c4vBsmwxSshKKFs-a<5 z@zV)_3*N>d_a6@NERqbOnxqOc% zlM8qf^>1o%$`zkEZ&B)ln+7B~Q`EvzLByd!)NKRNVRHF$7*ZKFA9T9LNIl8&mPT_g z|2hnNI)F6^fTLv>2)EZvhJr9_lQ#mNX2gPTA(M%8dfA_0zW?)LY@8vB}631%`&780^%j?TlhfDXmslk_m)7AP) z1dCOVj#y@^DTpTG-vfvwe8B?*2-5plUH>U=b|oe@!n}#B=*wdoE7a4a%GXJq)A%^msx&W(6GAOX7K6!L!PcWSD^qD36r}0#I|lRhRbS#RmY6!W=T$ z7bH0HntbHw#?n>Z7cm6M@aQZ-UZ3}`76?)b@QH2PY|nC?6YYN#yGU{~cFdyM_ki;0 z4s?Vo$)n#(@F@e#dQkYrxRUtkT(be zdJz&0P1<)9?&o^PjtuP#YXDVAx+0ayU?KEvOh{}7&>E0LSMAgfAaNjTat+bL))aQR zNZnZVay;^%rg`u64t_7yRFEn8Ld1&%>|Axo1G3S<=k{MG_}4EmFY*(z0FM-O^bTNT zUuN!ZMlRyTpX+6sFe)#-NiVQ)*oqgS(L;e!Enrp5EXr`W zLGqM(&9TEggW^@7FdB$0C94m3QN?{j86Dk9%xgW@j95A?b^PmDB2jlaPc=8xe1t){W zLbXbT>gHe=Z;yc;V8&IzL>NFUd+IG!BQnN`AZ!#LL?NYEXp!{40@H`j)AQrXO#gwN zZAo-i%WEl%@^aaAW3f;@F=^>s|3V8pWCIRcQ2}$&ZJO_>xF7H1S}Mw6htxx1s{rEN zok*v3KN*c4=;Q!t(+2dZ(DZcU0L4mq)0!xrP)gGGGKw=-%OcOSV#f z%7mZBLXTb2p>EgqQaU%b~3efy__Ii~M;z8H48 zFDgr`F-$f;Pa;Soqt2QXpqI&lJ-!N}+7Y5>u_hGHkH~=(jIp^jgluc&9m58vO_n~r z3vv}C6{SQQ01kYL%{JU4ZDRcO`+ z6!?Lj^#pWg_slS7dS( zuRZ268RGJyI%H0%6~wT2_k;RNQNtPiDhmXd7@W5$r_ugtVtdk~gu}@inddW$20S`L zKiuwtL%Bu(3d3>0Sj$Ib{LU%uw?Oq)k&ihWIj1&jGVqiBU#IpP18yYl?8+**`997J zxpt)jnDdRqoQ1%b*05U$Yy&Lh6G-#wFEM(fCmbKL&sCyvtdsM=>1B5Rp02xrkaqq; zN_~6JuBMAko3(&L@e8&75{K;gi@^%>LlVq2&fU#SRGhC6&Zq7K!IK}A&AN(t=;s)c ztNMN2pV9|r(<%Lw;9ZG2Yu9~u70Uv~df;ldFlQ3a^yWV_aID1U33RS4?#t{3@TaW+ zS{SdRH7R`7x@-(_ zGGkv*#^aSB^WGQhHMLt5e(buRE(j)0Tfnrgz)e4*&I-nW(?UIm*Y&|T2hu`*xZBE9 z4_r)igx3{1*(>P|AkH;QHL{@Vm30x24p8sM>;sgL;;viK(arVub#(a)2*s_x zCBI4xQ3?5tC-7S&!;~H@0g)S^#hz7R#-eoO-we?0Fo|L>iTO)>o5299GICOg;K(P% z3=Qbzk0)j6-U@wt^T-Gd&{j;lJ(u!0FfO}Wi?!jjj)_6I%|`hBtRuEXE}W8)0fSnG z9izaMDs$0v^V#aSFHL1~qg6dN8~o$ANwbV%1@iOfD<{2cSas)zp8g>?Zji>3O5;W=+h$lkWf0 zQM!%>2;RK6M_>DIv8m}?5QljD#6VP%!LRn)4kg6g#IY(Tw_pJ!N4ZnH|5*u+L@C_BoMN`uBm*U#SCEqIn468TNT! zNQu^GBQ5zKqyO=HDxzZ!RipPX?6WpH=3$)_Gv|+Ie-%PH8&}QiW;up^PJ^~(K~9t3 z1oo|)7_>pYJ}$yzTtOc~gdchJm&SLl%bO{&x!hZ>NxE zlV?TQ7t=qZ8a(&P?XdRsMX_&-WYwNB`sR6OxbBY`q-iog8QZu;+Du@$+MNVx&=LHF z&#k%JYewga@;;|-eT-5P?L_NB&IK@9F=b$X;t%aT%4mra!B%=bEe5LZZfT_iGjE$) zW}lR0uqB+46pE%@Z6l-AOICCqs~ySz!e|S2Y!^m*J_u3Y@-p!Hey~~kMXu#-9SKv+ z888&zWgbRD8G9TZvl4b`L4d&#qa^1%cB^!R%4jI|;4pAJZxzW%Vjf^9#9qxDMnjna z5}V;}JI+XACDAbHs>d;`&sdS^FBHfHMNOugK z=YG+(mYco5{`Pg9bAIO^x%OI%nYZufdG7lY_sf1LFDtQs55*o73bkKK@{%G7wWAJ& z+9|wiCwx=3FWD0Qv)e{e9g9L8JB9qSMM{xz5{25QV=68#FK=RPXN@(nwxN>}7pJqa zwKg)fz@Si0ElH}5%1Vxu?&FddKkh0&v+Izd=NWoBaihRHw=8V#Gm4!!sdMO3+jGUs zBgYO>*(+aW(IBC-r!xz)uNDw_{ynzgd&l(ZQ?aBm(N1)yOI5+VaP@?9gkzhF?ex|a z75ymA2=48Bj+{GvlKxU4KKx{Fx+iKk&4SHA=||5$Oigj1YKSX&1-W~+qF8ety(n{C zu{L6Saa0OLPa_tcE~$t*;DXB4dTpqTYNfnYY4}2M$J>&v?3lVbE>z~BTc(*`*hp>! z$4w<{3FMU8O@FI^x~BH<;~-N zw|H`_y29T}Vhj8BuZMEZos*&zl(>EbAKR$)`N-){vkU4^&ZtppvKgUR)?)?O&}s=D z!VkppW;&~)#P#_+KIYR_cGQ^*3Of4f_r;s>{SWkA_@4-zB)`QXwpe!L;7JNM zGuLB>!(aAs?YJzws))7iRd}aSbmhgfBXNz*tOvbLZ5ra9@1vnnTdw|p}$TXABE=r5gSIE31_-Q@A>@0To@sbA{*r%ycaQHlTl zjN860DChgrsbJjTp-*CW<#)Zhe<0}0CDvYJK}x}s4dHji_w8)<`=Ii8=2GOveLMF& zc=|wbWy=o3GsE6{Z=cv_c;^0AS{H@N_M_?tJTGt!)Po4L9gKU-N11 zao@IWQ8ZOr{(PsXw zj$Wr6`Lf-aoOoIE;**P%4K3=Wev8i4>B3{OE_El^hosKI&^Eb?)g*W80o)+VZT$t!B}PgyiB&?0fv%3ft(Cdjg*BtlAk~aE|lL z8t+M&q@V)q(b;gB@_Z++uA?(b+NtvjTW-b5qwhU69*DjB;VP!^+KDK? zeKd@Aj+DdOBBP9V@rWu_@1R2+xTEBuhw0q9M$_KjzP$cXf8l*N<1ND4@&3WRC!V92 zj!8CLd$;q=mRmb$7TE8R?|i@0$L5}3ewP>BT|LI{es}Gjcx^|YL3x%2-fxb5FU0)O zw&4Z~?~T3g?^(I^MM-;%L%%p{eUM3iwavHoo~o1Ff$d&3OxJdCeSGwmL2H-e$BU00k^4HYIcLHhmCr4oTFM2!n+>c)@C*|l@EEzy`JiaJrB_5WOo>!G8P;-FhC#UNxUMV zT5`2Sn@NjFT;i2dv{F=>%D~I2%V8t}6FK*_1e4kLe9rgDcC+?c_3~n?Zwh8lIA0MW z2^VF17*HNknb6-z^qI1n3LhCBCT*ClrA|6e2#eB8%2S%ZJFeZHh5Lf5!qFGJ!z1W_pXiV1aip-_Keqq!ef?tc`x*C__oa{*a&vM}m>n@zzQNsTl29x4#_J1} zflCj&LEO!pshvFxU&c;9f9U=2>m~i^7o}I88Jwn$wooFeKU1$&?;I@}7|t^`Y|vKn zM(%2azet7~>5S=N`K>M&p3~{Rm47R3qcWMCg6ZrkOfAGNH_aD(o3}4oTfMVXx}-AK zT03#I$kFIx8he^h+GitgqpV6(tTC~+|5+s=kd|v=)VifJr6|$^v#!1BkwM22%5sP~ zTEpTkzrj?U?JdmRs5;xIzJujeTkdSRu+5f)nbOAQJ;V9K38?cqjhqSM*NgTp@AAC2 z_|dFeK`$WVo_%CS3odL{ePn(c_0H2|%#_&%U6z#L-dQsEO3sk$A*`C`TNN_vEwY-| z%t|tdndR>^^&H#AGYUN2;#c|RyywWMm(Z8c&jl>7*?qASCkFXTZx-}mm@=PbDTUXY z#Sp6^(_*kb*d!wQc-`mn%j2mneIMzX=prsWx-debjcvs4cVKa7@5ed5yoImLbTp{VCS`c3#>0$Y6Rq|vPC9! z{AB#NO_XXpZ^U%9b&Y+HyV!Oy(68WR%H_h>L$C4j=eX(9IcF>aZ>rg<$$Sf&yxra0 z-TE<)UWg(3O8TW#`Zo;6C3GIAKJmZQc-h{YO2l^Q>zi6!?ZaB0+Ijs@gTTOkh2Gew zZ}2|3N6n8XJg|HsuBF^om)$x=I`!!x%~iUFgmAhd(797Jbn3Y2-5-*Bee%jDyrA|D*mT zb#z0VLkvMh77s@+;60lB6TO<(nx)fd`?mKh_t}+Qo~Br=Z~NMok&{CFKFvE|KM>PD zai->MpxRqGy~M9dR4i2TYKl%5hF&MiXUa^6rMoH~KU`^Xj{eb?qdalfRIWCXXS`W5 zpKbqs>wC+0zGq6OCs;YoDLfAi`YwbSe@+tB9n~op6>~K@Q#LJ}*QKR>=tDiBlFrDm z$|TH`E6vrYB=Lc|rV-I-pmHs$BFRFk`EiP3kr`_ibA(FAn*Aq2>$!dB0w0-oF1V#R zkP1tP42-tvVO6VEmCq&#@l;#tH0F~LPZ8zZ1ZP@@t@Dl>vhe5Cn0E(X9=-hNvg&aX z){fLqCQ?KGb5U>byv&DL6SU^^7w`5lB?!egC3hvsr6+&_bhJ2jmKNm|vg&IWZ0HHv66*FD#?JBiOXk~+uLZl*S^wDLS^kwAP=fnW*_9YrnN>`@8J4HBs61 z=Gy*7hc2tZcCPtD6YUlO>7r{%gIQ$Mee<&us={w^^7A#T-D?uvzE$fY{qsI0WhE1W z=hxVm3>puYFuAPlTOwXl)le-_>NlNFTdb}Ow|4KIdOeF-DHlxHqf_9az4&Fc5}(y! z?OP=6Hs7_{OBPDjNE;@?>+xvKE+Ow_p5|GjPbkzLRM3kZLaqA-W44_h*wS&LGMofO z$DMcf)ND3p+>lZ~E%ImV7oA7gB4B}_k&S42-| zYA8&v$|J)rVB`T`!6#vQ6FWN_0X8;AM@LpiE>>$> zV>S*n8qLPe$;Qda0(-DvovrNjoLH=|3_nit*Lf~sum-lKHg=}gR&>aD_4KXn?S$#+ zkqiC(^YghZZT`NH74~QBAc|~GdNynvtn6(6=^#UczmKu8x3$=~HA4e7j0MILV`Ybh z<2e4~aW;Q(!M_jxmrMS=`G34HjERiQe?IuH`?a+EkC(>UU3P#F{0!;8T=uUcvC7Ui z7&b)=*4p0I0CU*^9);mQJ-wZ&(LaOpFK0rw{EzpJaWefM4nwy5IBa7o{1_o2cvb;% zTa2EawXL$XwS~x!S@sW|1~v_|ijVG$jGlq16~eL43bAcI=${e)=X{t;dUhBQI2O&q z!Op_Lugt+Oz{w-Pfj-a9FTl?J%SnFhx#=7-)`q4=&i~;YT-*X2T)&>&%fuDfVj1VwJqEhMuba< z?LU3}ACCgzLjH$tA#%wSYh$73{OiHLZ2jfvjhQMSWrelVvogR)T@ryWSWQh01@tjS zd^{W&Gz%xM9w!SoHzzNP9zT~J3m=D}0Y9%kzdok{|Hcr=$ozWvzn%J$wShgd+Theb z5|g2|0i6DyhvG!*@f&hsI9RwiIXPH3IQR@%^z`*GECxoL9K09T$pPPdRZXV5I#G}W~!p*_0&!W%Iq0genj^WnlG zF&lY6K+gcljUoof^1>JjvHi=p|J>H!NB%s_^xuc`zYD>S^Z#=A|9lNc6O7gG7Uz#s zZS3_wp9E`dWap@7i@9J7GvvR^96!$cuLo|vfDju}O)O0RFAN1%&*6V>ApW~`^}ja| z|B~VUUk=1SGugmI&&n8MD8lyFB>wA*|8DGljOf3vuD@37zpq9iq`(QlN`_gbx3Pja zgxLP=yMM0yV}CVdMOxVZ*q@u59e&t2kbnO?_Sfy3k5&KwIQG}=n~(kHP!%gvI}y&G zm)rF9FGnGD_(zFQ0?3FF;pO4s;t^uo{PpG|hw`BLem(S;O+OF)F<`#{yp6T^<6D4_fLz)BhOYm%O#jYj|0jR>=b8Rbo^{i? z{#;~JKz{%6Pq=;`pG{l;glkhke*f`LxPBj>OQ$T+I z@lUvZAD>NI|AcE(Kz{%6Pq=;`pG{l;glkhke*f`LxPBj>OQ$T+I@lUvZAD>NI|AcE(Kz{%6Pq=;`pG{l;glkhke*f`LxPBj>OQ$T+I@lUvZAD>NI|AcE(Kz{%6Pq=;`pG{l;glkhke*f`LxPBj> zOQ$T+I@lUvZAD>NI|AcE(Kz{%6Pq=;`pG{l;glkhk ze*f`LxPBj>OQ$T+I@wegH^Uuqm7%O-K)Dd3wY>VpF zhSx;t3?vn0P$)}#6bkziwS{C2g>rv|LK!|oZP`7ALUEL$PzPOHlIwa=+m1O)UAmy` z)H2%c=yarSX?=?9z!0UFo$0F+?7MJxnD&rFy`iHK*!ue8tFt6W4qS-ZeTT}lj#N=u zUS9rya=eY-3He?0Dq`YWPp02Z6}$Lg_bH6K$7Ji`xP`RI!I{?ZWaM_AQ?d`2AKPQq_FUP*(m*ls!1iGhtpECB%q?cDz zG%OMa3aZKj*diVsXA2+Wq;Z|RaQX6O)AhAgT-R+9SA2-DOQw$dBBt4b7rsAx=8U9& zy3>??lG;0ZiIL^648DW21l^*cF}RoUl?fgc$|h`^4bxuub4snM78Z$}U5+?h?$)hV zRi-Nw9_yOYc;?zK-jt0As%&n{V_9X-n0)8PT4O#xK0aVVewOEj>)*W(YR+!a>ErtT<#-d?Rl!&xpoR8O-UK9i_;+;r2cmO734B-3x}Cx zX9SAGy+|pzjGn|_Pr|kC*fTv)ZSA9*ZF7M)WGque)?;~$kH@M_&A;J|1erG_pU<=7 zsQ0rgyhY(fE7Ro~8D=lO_w=yTTk?jKJwN*<)3P<*pu}g--n~6tJ8o&(g>9Q;TGxWr z-d1>A-i`J36cT>AtXm(h2c$0X&hUafoMD-xfb z&0o~VYw_(yPPa{-NlSWMQ;KfN+qdjvZ8^kDQCVHrsmpFFQziWi&1uFesfJRrH&7@7 zv2_8r1{1)9kgVN|58=c-(s3E%A-#dhE+wE*9`2D2TgGn;RE5>w+Oo}7*=T4$k zZQhg^2Xi|??Dp2HGBS-*JtY~qSu?lE4=d-)S`t}CQo;wc4l!FN18UogqhG>6jex1C zX&Edxf>7j^En9Gdue@wm!X4Y~2|NQ2Dl00KJMx_?bq*8E=SG|RZRF+sV3NQr;@^LQ zUF_bTqu-$_*a#O@rVPM}QJo!btemQ;k>|1Q(2^6Hx+`EeNGG+2jEo5>5;oq`b=%*E zB{)reA8yS`=_Clxw=qZ!Hzouu&5b3f>NuZj^^)~I!Ev!#cs{g~@bTVWtfe62!Lw55 zv~y>8MA=7rOP?XT!{SJ!zx?P7%sg)jo;p~L1$a>i`_lYGiel8&xEmktoKuW^Fx^}F zCf9z%toZ(Ze5#=1xN-=u<&hI7V&TwO*k#YYeaZ>flb9E!I^CBoc`RER20CM_!-W%6 zb=_2W%o^lB+}ZJhO;<#C>eJz1$T_L0sX}EF9R-@J%k!$MOS39DwwN6|cb=o86Z`z= zs1l4_2Ap-oY~b;6w&9}n)fC1!b3!t1qF|m;3Kqyxe~2}IHwvXyJ#lL!ht0Ajox{sx zbyk&B5{0^De#sXGd`hAh6T+@{=j!t_dO?{U>+UjP0z9e&25xTUr%#`@UiLq^l~Tzd); z*X(LcMF^i9C7)FTndr((_^0MtD-i-?4%ryOP#+@~V8@eXmZXuP{8DU78lk-@Ni)M` z-b(h$MrvBYjkB__$RwzyG(qewWz9SC(HpVI;6(LONPWo&b*QbaH45wMxt5cABvh-V#M-gG(q%Hd${0=h$odk*aJ|n})lONu=Ub=Mm zWa(gMQ4xA9Cc>SQkvvH=tMJsAADoQawC+>lfUEsb-RFhHfrx@8=N@mq3R{?0cxNwC zYR-Y#@%Glxj#P}axW8UjtM|;z43(vLjBHq{_BuQWrT-HF`(d?c-xC}kwW{)+i9(sp zIU@c~wDTN-h|w}3MzV6!(rFD)Kszg(3vjb#Hz_CDa_STL9LKe=I4HY>%&o{&7_%29 z+q;)*OO-J)>M<0z{S_N4D4Xoc%;3yOsa*xL=(oFrn>nk$^= z+pxZ;uLaUcA$h~!-`}cb*#}Z0%;>CqE!rzVnp?MSO?Md6K(ZyCB#Kq-t=RfPiD*N- z%K1}_jB3M)npv{`GYv{|Loi-h6?;iZd0jALty$HfI#E}TO8FOe*TACha|{b5n|k!% z!CU4Y4cFCKLVxPoY>J1o1<_-TNb5URDhuiD=&@s`r5<^ES5D=^bf~7Xf^~@2f>c0E znWuG~yxrG%05Y9$Q9<&6ETn8wui~EEFj#Yzt(imLKR>4O16V?MASN)$G+8Ijc9xm> z8tmfFFmnYd1Qbv@`!ei?>O>7GiGAfUg>K8|0Cse`621G_N+DS(W|%cr&~}oOlOx$6 zGJ$N`tUlVi#2hMtf21b~S#UX0RnaSL*y^EoB{cPrLks#ZjzP{`6z737LM`Z^?BtY9 z@OtR{3?{|eSiWg}bXf?2*u&4w-H>nkouxW~?ZtUjJY)H`x)mvDX)f%0sOm%-4}*!? zH(nBN;qH?MvIw(nv#ah)Lrh3zL{Px>B#kIIQ=Cy{uzzHCvDZkg1Z^XnhoA1RY9Nz7MH5CaTs+_as+J&w;^b8CvDUhpHU$x>0+KzD$CyfGJhWldQ@wBY#up)Jw z`;JPb_G;SmQ)#@@zgJS;EMDGi6Gq>_M#nHlr)C7qNi@s8tA-Q_6hfF=@J*OwI) z*RVN|rn7|XV8TZs%Q#*oA^O3C2Nqey8711VwB7LMm7lxEv^ zHBA^m0FTR@MR~cswsq6CY81-DQmfi}ZMH2=IZhF&qmX%%U@gR6etZl!+o(DVt2quk zQ01SzbEasqpOW+vlFttSi1#4PFeh9`u$unoJ>E3JE&lO6xW+{F`W}gHD8AMqmdOfl z?jyj)tT8@F^eq<`7fYPAMyAEk6rZ`O^K`F5xR7(j6s)dutgN!UvF->^E-ZI*i5N+k4#X`=^JGe0>SGw~@?zIxKgFp8g_~$mzwxWDiqO z$MMi=+kxtc`7;sJgt5|xXl%dQ)?I6B_6Nwx;|2#!geTu`3k7BeBV0QxB)B-;rv#`w z!>0S9RNdO@GI{|SeFU1w^@cfi)IK_T-fn$$KBS(LlXI=1)pfqzF##q)zwgJpceks= z%3pBE(}pDglhv%VaFvIJn4CARxI8!3Sm@^B20P=1<6;=47$kfe-s%-Uhf14f@$k^8 zh7?`V*`ay~rRZz5kcv-90s5U=F3z**{s@2cRMFKnKhwH%Jfk8`DF*5lqZFCQLKll^ z5#)jp;c-AmEG0e(y}gE(?YS!cGmz;z8;)E=R%A7G@{m@j@B&OoKQ06bqDaVSl#AR~ zD*{qTMDE|eKRj6bhJx235Y0l@wKNf6Kl)99MI-%feyAuj_E`}v?!MmOWOp&1Hr>DB z<%MlhbuAg@v&3pq-FX*2%NAv~SXdq6 zX-1WtC1I_*U|NL&uWH)@NY$t!P_J+$PX5(L8JEtlUnLRdf)7aPxSmxfx;8~-KhdGx z={6rmN-Yoxg%x9DbdHyIqeR0A0pec90>qN^hoXvUvWCUcUl|eu1mev3^U_dTTizLX ziL6YDmoGEx7HR<#BS5STPuz!Lwwvs_fDD~ckpAaKQvProuPQ_M&YwLiY~*-&8Vm-$Vo~R!npJfmkD7hMSx?l2+}kU)!6h4k?q-2XW%Q` zpJuVPve=kmu1a)j%f89Lbb13f*a$lYK<3+$^U%Q`}2ZNY%Y;+s5hfP0Lk zMrmw9WCAcPSfYdPrg(XbbX3C~(EmBBpCbNsCGFU68AmLa94yDd9d zb{1+A2dd{a9hPQ>`fVVw&%)gedGmG1L(aj?40dP8`qBv7K}v$htPGBt9U&}ht>sM= zCcJ+yrk!JZ84w^bkF~I)S|#f03vS35$fN}@W>)+9o&-72L-jPH_8Fl#{~4Gh=V1Z+ zH>4R?TXgp141{x8_cCi`*Nol<(S<-19mkDZL7M3Iyk79G*#bdx%_Fq%KxlCU70SQU zzucIj+v$4m-o3N@{QRvrSWyCy9(am$Z`^nZV6l6?Z>i@zjBs6}PC1`u5GRJ)Zcx5R zbQc1pU}8G2XfFXLCdi4dMh5ek6;TSxL96fmDSpqebc~g>hp2Pq0g(w;156F zvUc7V&bh6(WB2^J%SliHq@|_nR~CsX@ycg~i4|PU_z5Urq%=aYTX*a^M5e1!kxbFzI^GD3EbdPYv&ri$Fe!oG6Wg6#6)Hmn8YwH@ZfkDYixb% zhqF*qZ{ECl_1ZOMSb!?YT4=!eI>2A5Gp#@yKvoSzN1Hc922=K20b(qX)6k$yEnp{k zoK;I6_z-euJ9g}F9=q)U^!sy3$p{qM4P^j`b1J4Bw|YD5Fs!5{fI|r5Afa*U!nXyY zP+h)DI>oa>j*-#P!*B=?Kbwq84-er<61JkO#t`(gfV~aiU?ArJQqT4tXHCDB)@*@; z<;`PKLziNo%;&c@l2W8mMo3VV1EO&qO4;H?5Q;j@;p_q=UDdNWVsz9CM6CzaVS>gY z%;j+x@9lASxrk&4B;qZZmI*M61xqF{C+^RUx1X2F9SC<(h8PqAGoVD=I2x=YcxK9Anc-EO43c zU(l+sgk*$}F=c?jK*NHc9oe{I$P+OEn~>H5m#pE2xHqt`ktUSwLJ9%9*ba~NRZ(q0 zSD29JRN|jseQ_=d@-*fvV0*bHBd>SL10pY*wuNGiNpqR887WWlx0qkg&eI24A<(a zOA{=d`+9*X{->meK{?O>4BFu~uRZqdT@P6+0Vr57m$Ai(^hwc*|<7fr8U!Xwn@|atbo80+&>^}6KC}s&1Nz7SdmnT^~ za1I<4qzr&$kju?00y%W*gWIZpN@eEfA^@8nJtN=cBSe#ynhHp0y06?3{tm2G&TC-8 z=jggxSc^bOYc5o+eSH~Ab*Z{^dSiCHUq6|#*CvF5&ni?0H*^ZS(ifn69g&=J5{xT@ zF*|GF-%+o`z1B=ydtfZ^Q-~g+_U@y3GlUZtDSvZ+WYK(wiy6qDP`&yy2?K#FA3!?)ou*|$H zWMRR{*FKQfQp2ao19%37sQb$Pn3~Job5I10hT*G1T zW$>v4jRNE{1Wm;ORSf38`5M5aYm;W4Lz0eD_YRdL4HeKH5$zpG2MA&YO{VcFg9LM* zX1d8Mpg?AT5Aj3KPRl5k_)x1rdV6tB+PfDt?)Cvd;k8L zY0HPRK!^Pdfr)>H^}C-3v_IxP7;pXUJ9d!!Ke@l3l7dAulbewoqz=w<*O^+0et{KO z_cRj_ywlhuQHSCAIKP2B8o)Q-K!)N~v>-Li7DK?lJz0{b$7qKe?&*={e| z;8|U;jHIpCFL>?@Du#5SVrQ2Q_%$6k|9)x#Wu&I6k%UzCzas@YQR&cLUtix?;NnQ^ z4gs2=iimm%*I9rMezl&M8r@DpVh&gmgl)ocT~|Gt|;+_PX>4Q^Y>(721}?7p zUAuR4Fp`7A!&{EQV1f!7M;hV`kQq+JUt>--3b_#EJU_n!zVp~BENd}fq=l&-yiV29 zx-g;zno$Yk8VtxmmtrQs6{swYuUxsWUSglOk73>=k`10?fHTz6BCVNOxO9Ipd*QmCj~qBC(m`+Ba*|lYfqvG zH-Q#H;9@}ZF#GCv5>GP>7A?1z^ow&Z-i%d%eRAi{9Y(35wWSfu9JWJ;4_ETiz}QL1 zO#_<OP9#JU_671x9!|F89U&*^CEbJ&Z8F1sh^p-z>G-|p0z$r$X|ur z$mMljIrb$mb~Es|a-n=I9@r?TD}CVc+q8m?atA%SkJ(}LTdga93~|eI&{yzwJSNL9 z@1&QC#B$AVXr@LxE&?p6)H4=1CWVxrDA}p+pLyJt>`t9NZ3b@F9>|FUGJ)(DfLn9X z(l~>h5J;>F7Y>0~l$CMT*J+iD%V3`oyMg{T8%M-JLc*&8z^q*KBBSN?a+w`IHDqQM z3QiFsv%vZw$27#Sr~J6vNmv&LDhj}LfLmJ)9lZlwIKbs#V{t%3k%(OQXW98!uf zMIc4UM~Jx1l(Q9?K&dl2U=NlLVhl0Hfy35sN9aluWs(hL_o8*`y4`B4i>x9lpGS}C zV9E&T$R^)z1`W*|;Bfx}plT$;fe%x;Lh?Qd5CsB?iab142SnH3Rh*Z9`F=lJ5u6p~ zAgiN*)8tF^Xi}J#?_Oh44}!rd0j!$1o|fl2M_ew+F6 zb{_ptyFe)n6s{R_$P;iFHNl?+?;0H%8fqc+VhVAq!OKtvJq@m{l4YgswzfFn9|>eo z7M_lnr-Kw%P$gzz`5;>IGe*So1l0rKDMu(M;z4#oXal66j2XrGFFY?@p(u3Xm+9Hr zYp7^oLDIO*C`4eim0Ccylz@pV54J2KCW6nS0LWIrrt8*E;vTE;=1NxYH}!Orr_pi| zR?fG~!DrmL@5D>1_S_({$by4a9zq}xc7!69=;zO$!Sw%Xd-y{Lh`Lw(Narc7*p%08EjF0hq5JLV0bv#H7g#2;hxJWNojDaPB7u zCXXlr0H~1C(}#$PV6vA^Ej1=lz&@B(l*G6zP z`l=&DTQSJ|q0-5*jY2eXk&Wj@W$&*!xKTxLvyCuxbFCZWH+D74L5X-eBI+-1a@VpW*cBFXlnZ<9XF>(GVPUD_gC{w{D>d zroK?_*}eOzVdegDtwK9D=RBZ(jsO*l4_%r7;sNz{24+_rDCvAG4_HfWxAoGlFLnpxANsx$5z!Ii06?k;ytUf8z>C-soJV*gXUA8dn z{*g4oI5kBbek#%ztlAogDvf8+wEO;PHBB!G=H0^miUP=7^`0A#|o<<4~toQrM> zKzT5U&j<@^BeWmjOS)m{At^;T|7`CwxnPXT%%Gk~1rbpVf!x}I6Bh+7FyLQuaBv_> zTA$G+Kz>L?0Pkgq54b6C1VsP=%C9c&0Qp&1wJHY?@)Gr=^?pm*I572mJUQscQQl;< zA{IfS0G)hSyT* zkriiR|Dx6$Q-rHNO#qhGb_!aDh^czJd zWm6*noyuY2X*e}ux=N^N9KrjffD+Y!^rTj#Xl5ltUxU${mZNc6Ga~gOx;s?*l#&$$ zJwP|lW28jdlb<|!65(1P<_u4DQP8B zWCRc~h#IVr1tQ#+;t-659_O?8_7Vmh_Z*b^)D`g$0U#bOM+-})0Z|jlsy9kA1w$QS z00cJzu==siB3&f98l6^I=YgK!O`(j`LL)&ebo3xLJ+woF!#%u)eyj6BLT$_g;n;R( z3+)Mqyl8&`FsRU@OV&R`#FpXJf&(l0SDu7$ALqZuZnAbrz z0Nt25^{2Gm zcHS}{_dsQ9r~Kq+=XcaVkIgIaD!D(h*euPMrt#USsRe>rHIQae=(?z!VWt9fdp5U| z&AKBW>Gt8a?Uf|Dtpmg|1?9u6BY%;H07>y+5TVa$f|`H`Rn7Q3WR5v6hhA7| zy#O^8I`ckIF45~ifWhtiV4VXpUp!zFnm&;FtU8$AwvJ^nLnjoVdVfa9i+*%JT0-gl zNW0i#p?H-=h!*)!3q}Jf4yhMi=w$qMxXy%#dboq3sW4*aWUYxb_rU-=RhGIX^p*$6 zy}9CD2W2M-?2HjGb5tSQlTz{9R62L1ctPs`NH>*J1Zact*%gT-jMNT~E09&6F~V>| z*I)-H8(306>F0yo2aTvhKxb2io*a#IlMh}$uPq_qm&ZhfZd#jkfNawM{WV8ns)E}Q z3++tMRilu+J!Q4@>sNVbq;Q9xA>p-!o-F3DQXmlN&|%^`v<_;PZRo(NuibbX+6{ad zntJob_$UCm6CRI<43Opl!CVK<02n<19K8ex$~oP_d=LnPXgK$vTvN7y%ujVoYXRx- zvpE@!wEg}}Rg)}iGVsaI1)OoyyP{%120^?r*-(}V_mDPU_NeG+GXS=T4m<<>cd^i$ z2%T|-h@}Ls$yeq8P?;gEJ3prcSq7HqdivPm? zEE3cfsLM#|Olt$lNf`i+D2B2CYAe#kRWSwG0AVudcuGpj1ZYMCbS>!*$T}99pXwC9 zurP!`gEx}qvRMId}4;_GR_0aT&Eg4S(S^g&@KJGZ`j_YUbZsqS)uR6^si zauYCk9CUMvl!GYWfAxSc00Wo#@kWrnqTU&ln1LppQztuKqC3`-fmNOW{121(Dfy*< zNKi#I%PJy7b;*P#Z=JiI7z@!p1C1#N5`{DzYCcc{CujiW1=@Sz_G#&E`4NU}KWdf0QFNY>cq~t(j`Va7;w0ca98ZpI{{95mQq9a!d?I8tOJV88%D&M!LS0H+;g(U|cO$aEZUi<6*r zYoMB_i+U`wJjx}DD2>PF`mN9sq0K`KuEkI#a5G6whQd)^GZ2;pvFRuiE{P<~D=rvF?p!e!O3hlKaun@{iIoI8rLm?pEC;0h6OGU$(9XVGYvu&-BQ4)f8B%%LtN0aMzQZ3o z2wfxb0FkOaDEQID;!e{DFR*brvRGpH#5Vj*0y-Is(t6sm<305$n7E*;%@p01D0`ePm$6`J zI028k0kRp=a|x)we90)l=Sv7s8!(PwY=^)HclUh!$jOP)Ya8>%8{-${1jh@Q?a?M#eB$du!^c~9$1A1h{#=ioqLOB%7^=LV;zJRSJpw|%eKpj+Y4rL5L5ja0*j zpbkgDvJI>UyU^B-IEkxz1=beQeq2`tnWiCGJC7UM{>rBj6@@A*MDGOBsRZrAZ{X5U zD*9tPKv_wLhd{D27$@lXXMTP!K?y^e-M~+5V#{+T4!`oE;Vc2}`JPOFW0_Z>{LC52 zLml{e`)1D*0Oro41VH#Ww+P6-&h06@A(bcKC5I@B09I{g z4C3+x9Qq}SGw663We69`?mXHdJdG1UIbUdE;(kKRv!F{mIjkM=q>LMBe z8xK#T(@<1^>&_-da$q;f>T5uV+{;_W8~{1Bn{?#oV3wfYqyl5nk>AY8#>n`|x&~71 zE1D1K(gCc_ER*DX7{R+IF56=ZsF^@{ zsmk0Bq-y9Uv$KmzicWjtv!_qHdAi1z5Ss(5T;*I3X}dfSjg9V11$O(6ssudMD`1+f zG&QH2KGQp)YVELiejc0_9m1j+OrNzC=Qo;JR?V5O+O4V`JU)H-f@`>0@CxZhTiBnP zSM6v;s1)(ivex=$!OH;tlVY{KJKS>GYUrGU_}A8)0pwkXH;@qAN1(!y87)GfDL_Tf zk6vAZm8IT4(US3)?bKiJ(tKI#4WYr-}hGm*}{B2NKHL< zum&rDn~9a^`gWFqq1c?RdG+X#BZf_j;1I0fsW}ZFz<#xPj@IQfkTHVG2cabx)3H2J zG?C^FlV7;Q0Bj$T@;tUYc(DF_=nFK?OM*I@cedmc%p&Fs%TUK%o;w5mEy#SwcKGzQ z$-HrRH-ke_Ny*#K&(9)D$^Rxi6*59!pEBTw0G)Dn65#^#v5v6ZirIy%w*xp~0RK!4 z3@?JtU~&(rG35>}z$=8UTo-WAD^{I2;BN4~HP_I{hyu7kxdIv%n_lt#J`>?k;anvp zrL_HpxpQ~t2+~^qPw{vM?E!OO6(yCYbW;Gn80N{X5hK>shO_6NI~KkBPV*k@O?w}g z_qr44-okaS{gnL*Y>+nUG}~#dg=^b=r3uwpckkY{u&&82vIY|%jb);vr>#IDmxx3C zTpD7sPZ_A+QyTy_!%ufkfa!-5O5k5%EdPaSz-o; zOQRnFyCSWK|BRmkbdh1vTxYz+UrIF2YRxdNrU6fTCVEVhuu_4% zGuCOD0MsY59IQWDmL8-B5m3-9BE5rFhnp^Cf^x$w-7y3%7I<@4Vf++KOk$(fK=+xb zz2eWDlUX3lUKiBk47=lp5R$*==s81Hf+;j;)BTkrH?6V*G>hB|;P(VD?Y*f5o0wH$ zh>#a5?&~3H8y*Atzp_6!qMBAA5Ybm;NfPX#1fV||ptT`g&~=T*`z~F+td5_^rGa-- z6hS^t9&rVj8~OeFcjghG2>Xx|f=4~OnA6Q*A1<=kd$>Fu&}B&R(9jURZ3ZMZW$2k@ z?rX=s&hwCMdxAxfFP;-{H<8~RFb&2>HBqg0!XZUFuZgn|EPn(lKq5ij3W1^!2`mP? z27rmhnF!M+0haGM$cEGCaf`=*MxZtN(=?6v{e86naE}0EL%sw5uZN;5SND{&5chGU zGN&GfX6J0BQRw&QT!SpI%NO{=P&*2m9%WSs0xDgC>Ost8T?VTlT!RzqqDablt*7HD0-NVjAe`40PgY z%&7umsK^8ueIH&Tn5hz+P%A^amW^Ic0zw*YPK%My%ps|Rt_4P^C1@Q+L;_!X=z>>* z<^^uc7VdI8;~PzjHBvFK!biZ@QbF`35LA4vO-tnqu*fP6`ryqzyfaWWg!nKoU&zIYm(QvtYUQM& zN8LSRU^>$9*(DFSwnN_)d7@)eGq?cGg)~5`r)hkJ=K?$3ra_a?ypsibWR}o-9(WN% zu@J;gnsS@{H=w?PRj?i%Ar1s5(<05>PtzYJAWKj4j=FZ=0mz3Ca5JQH5n*+{)tUs# zYj7R{Aly?@U}jA&sjrlsPf?4m23!m6Pp{GL&{yoNodOQGM$7aSnn(L!0(7N3q!~hu z?}AtB(q=NByOLaEGzHv+p8|dqe4zoU+7(#jy^0F#PO2=6X8qkJgcMx_zSTj7Mc$*5 zMm3TjDF6Dk1^`s$5cDh|^pG%XKS4fj!w>e@MmCH_j0kH%2f@sZU~L}em}W~W>< z6%EaJTF0k{hlO#9oeuy;secLkAWayvZC_uTE67^ygq|5+%00kF@NO+Ja`=rN zJDSbWAj{!9l0m5TV?<;p9l|LzTD=_4k~Wh~1GNTuWmRgUr&@Xutc7@Z(*tS7ti%|X z6da#~>Rw?9^CNA0IT+r`pzuX3Hw*g>Bd&(}7g~@md^r)L1^d-13mRq(ke(!X(UAkX z9Lj91UYt?*c&N>OoPxrM)p2KyfGy0Oub_d3A!jNhLqoNeZ=E@#2?a=xOnLUm z6rFZKT-Q1135S;fCY@#560u)-{B*#(^Cf;-U4R!&?{v<_g7AWI{djkGEk2P2D zFVy>UvKEo%IOP39aH5bGX_-fsLFpfcpwX<;m6jIqfN9NAUY5*)sITuS5e1)?!c8LiBH*>+?G=78!>p&Wn0CxU4jr7x10TRJWW7xVd?!A9z{Tv)UBjR)r&*-T zcog(flX^*5&qAM#hSk1w;E&7m6Z0Wf^f6j4_0X!1n=#Xd_Z%@R2+8j3Ta@nX>FsbS z0+9fJbH1ZK`F1@Nn>0&cEiVz*oX^C9Hw0P-MYsYzKp*p^q)#r0YE3tN1J;a7q`UJ# zm?QEAvE{e7A9@yS2G*?i6BP$D~FuiaAIQtq0qdmb@j`WB5ZR;f5Q6knl`=)le4F1-$qUnNF?H2d9ehAcTZXC-l9GFm2-j_CJD9)2yuJP{qPw>+ zta@^_UxHQ!Os;uNm9W}%m^IjM!rum}U}_?7bMSS#8tgpLPJFXm9yb~u-~0adHVS~` znBWwe>f|<;Qs`&@Vx9v;&-djE^Oh6ybLQ~k0G>_PYA6bMzX{RRfx7)K_TB@is&rcy z#n6~g%n1ZkXcM3!iYN(k+PMRf8%ae&9+m z6k!BjknkpG)i|1P;j~02Gsdb8>lC4h`v&%lhvQ9aifM#TcEt9Yo|hD;)rF@`wrLbc zZ=*)%tWOLpw{2NFgj>!6USYPZS1%rEAMNHsO~w%9*FbbhaC(AfPgmvXmx(U7l3rgj zt1%vS9E0yKrLE-zM#ZL2FWGyPlpTgr;)e|))0zi4?@~R|M`s5STq=H_4xDrO1JL*R zHaHA*^rpN+VWsLh{?5GHsyjVBT^Jmd*d%6Ei<2beF)c)#LgL2dThDync%eDmwT&8= zUem(rGzUL!Pm5xujS{@))}K;ho(r2g~BUKur`ECn0dm{f2r7CZx-}sLt%bJ zF)Z4!Tuf<)DaMlWp+jEpLRDXdrCq8@VB<4_5Dk()zlxceJa+UhV5(4HO?+t~8#iub zglKRx0|vSdd?md_=`NehYcrg^o&pvlQ6EhRWclAQ8i`1VbS1MzmDUZr22$_&M5mIm zF7JVVBs}@zu7Dn%`1-p3}UI}-Wl8XIwZv2-vFImUdc`s5V`P$s$fiN2TrCFz?KWrV5ukja_R!CA$=FP z1*l7pfdT!{GG_QQYCX$J5++okXXJG@Y44xT#~8OFtx2vacfBK^YWtBUFEX5xwRHN{ z82xRz`&yHu?X$);i6cWSlc!IfyaLQ%_v)ru=MPml5c5;U1{H(Msj5)>q-{H;{J}}Wr{=7f!*~eO6;IQ{|@lSN~Yf! zQ%M$8Q0cV27u|U1{#V>qVHQ*ZWLEZ##4j4vFk$kIU~7T0jR}l_nh~gtvr1Q@A0JA2 z2b4zXYZSE*S49Pjd0W9oQTH8Z*RRWfI?dCLW@Mk43VqLloIc%Ov-QlIhfOa$y1MH| zA7-IQ9ES#3oV5w;5?|Zy)bN!3!?6OGvQCh-Br9uhdM=Qh744xnX)x^Ac}!CAb$z%7 z8r}g&aq;m3N=fra$PgKeF*PFufrL`nc`)xCgK}AXR_mQRcRZtICI%jpR|8)GMEA90 z#3j5XEMd?aj3?SV(%hkyDHa3&f5~}R9?Mv0g&X_9s!hY{4fsgP*b8yTgVEWZZzjno zv^JL_(S8y}3laIxzK3OONmqdFB7v*$s((Wg_s;+$9r)1kv=karwD^Y8e#!c)9vPOa}O2eoEHiWm%WF-MDo!@$h)!KF>ky}z+7OM zk9Mk5n19_mBcEXixb#w-&~3kGHi@dmclcIZ1!Btlehi4-E)uVnL31~>`LU;`Zqe~0 zN5pB{n#3NCVRr~keBt8&0w+Mb%r;a=i9W@~SgZSn{fM#mUu}qUA`UlUmOd&TY?^?!m zTC;X-`%V|Mnv(XBXpViX$ZMCM`uzEG9%)zT!k-zXVYgUKHpi4SQkDj0RC~fxdn%^r z$(Ga6PTi2k`I2Pd3becQ1h+$rHX~Q30fbXtiVk;l|7`V^stxhHDrW+`hP(VgL4G<*tR;blHHP{yj z=$>?ilA_(CCW3AH)pjP5gR~X|Hc_1n0>vs1>GSX!!LZY>-GGih2d?ALxWFr-Sz8lx zc+>iz(jUA(scHCb#(C>mbI~&cy9gT_5}u0YUuaIggCvQ}x2~GQ zG*3T#iX6}Jby(a5R`8SY&FJj#4D|4*f8?(2kv`t11d66in*8WKG~%CWP@%00YFxFCu%%n9G0fX{-Q3QB$|I^1CcZCyI|}@^K;1D-5FwCY8-6+Y z0DHwqmw+MnElD_lM7hoUBGHb|N?J@3biuK0w=ke)EA}p=Y?M+84G38LNW~Rf&-B>N zZHbH3LZgPp{WZ1=$_T+8yHzta(Pvl&L&VZn@K+(Zh5T*$$Mu<+=2%3ycRmePcYv>1 zc-LUlAuz3Yytk7W8tUUjQ2&FWsKIcrh5G|H`LKPLR`Cdot0$rV zIzrkP3=&o_T(n`tro~+|XhZ5(w8}-iTEH!f{Z^og;^I%8JLj1+<)nz@9Z*vcdT@`Z zd!h0HHL-;Likvy9>XBU;Q4~kK0r=aZ6+B`5LDB&^OUT@(s zYyO2%rXem@WKxA@Cjwb|(ahLQc;%7~i3ly;DQv{4llNu>V4yM@k@y3;-sq!BH+Z~I zk};fBI`+I1#GMjlE#Fi7uX=EKjEt4F2OT#hWZ`EzaSlP1MZ{!{r%?~krMDF{`&v-eIx8&5L zcLbD^r2Xe6ej$iW@Z(8r0^QTJ9Sj<%HXvdz2NG7L-RKBvmX504Ui06fTTIm>{#T8)!M_M3cY`N$>0*& zTDuujzqby8~;6e5Se!4Gq|#TDVb!%v{Y!N z;VbmqGdrE0&EnXE7jpWsJ!GT4nOqjfKAI-&0&V`Vf3MtydO|kp(=fyNJPrHsNc@IO$>-97659?5r zAtAwkp!R+!?`CL2HtNneX2HHit_`=UU4Vm-Hgf>HuER5QYA-Rh*iR_eU`rjyoW*?w zb2mwTy!oLM#0dWu5+LdQyNGhazxNEeAPF%zZRCJ;l%QR4`I#O7Rv68=mD0Dk@p37Y zd8pJpUU4p5`&9r>Lsy}5X5}XgiS-tmBrH`#R{{R?EE>N;JBW841i&ak@>QgB`0ltk z^T9k0j!DyLy9;0>vI0^IsW*a%iSHfa0*YuYBnBo)m{wSaYYTF^0O_b*ZMQ7!sTx~R5=uiRMMud_Q=81%f=5MprS;cKwcZM}#XgMVpy==K`hYhXy z|Jp$u3nq`mhJemIK{o-~Z;o?DyCDcsmD?v+y%YWhnWp*)-tpK=IrAfRKyb7^I+(Nj z;Ur>CLZQXPwB^He>4nink=!OAu%{VSjh5k8{@xftAaE6EYnPc>b+h#tZh8s2BH@%O zQAIrb8$;bSQ?BvDU_ZVC6Ub*1gC&O1=>$kj(kialaw@x^u50u-hw}ez>|Sa}Dtg^v z6_WcmU75g}^aeO^jp<>28@wROU`Qwt2>SRpzys`o(4*-W3bZ2A1fk#miH>4yUJ`lJ zS|mwECjbW{Pa7v7?E6^BXn_vlW-e6x1hue}d;-c+Vt)p6FLaD+J?`Vuy|X}-KpNy3 zT#4s?AIVj69wkv1<$|Cry(Ji=9I2`61D^P^x+_qel7=)ai_1k*=*sRxPiIkSoWKL1 zQu2HYm|O2b^HVL@>csP1;6C=W!wia_0GWWq_aW>-eM$b%RYcaTfA(L^O#F4`ud4aA zoMeAEN_lOh9*~65Zz+c1Qs%YH|8Hi(Fk@9a6mv>{AHi25>PQ-}j}?v=t>Qg<^w{MKq$J*CJPg z8t@u`y>7|_Jg;4@PJ``5B7mC687LeH7K&9F0mM_ukjN4x#5rPa!dHKvggddZKtX zCJftJBdm%HG*D2oF_`RdzlRMlR4c=ouW4+cO}i_fbe~`t;4eaQ9YaWwf`LdF7P<>! zcQQqLyuurV51>Ty2MoN}BWJm3Mw>@k)E;q?rq5fSg!|SzER5SJSGbfDcu3E*2BrDuU)$x&!&s7LaR(ssX zFY#-FnWCV&9q=6je0Ly?qcv`hHFQCR-BMlt{r>qoxU%*-k0%Cu#Z0;!uf~wR7690w z%B`%r9r=SD<-6orK93$r;^X=J>x(N6O+K@S(5X_#o%?7)s$wV+pA3uI9(vKeO0a z*YV1XapT`iZ&C+(r=ucH2^*7Gt_*^1R|u;-yakBLB@ua-7QZN&1b3cHmx`zGEJg&r z!fH%`y&mMyiAfc7mntS@i(ng=HBZMzh}Y=*UWGAipFsz>9BII9R{p5;W(}W0k*>8C z>~pZ|CP~bP6K)!H$?>4Dph=`Kj!P6yXMd3(fC0t4`HL0XDa= zrHOOUzgYb4y?eXdpAnI!gXi87_j9{fa-{PXBA~$LUU8-YO#-BR?@ETvZC_McytZ1ucj8f zO5uzbGO+ie<;`myqW$O!Wt}gnLJ(kL+T0U;WCI`6tiGqV12?? zP*^vep9T|ZBt&6~9)xHT;|6#wT<|LV<+^TqdbJE8p`4|$h(L)Q8TY2ZQU3(Q74$ol zVBhbsaw2P~w9{y-mzHx0)RKh)?YLc(M5cHO5nu&v5g+tifB;-vB!gVPgr@YpP}NED zqG1GDW}E7-J}U+hiOgyD3JF0l;*)D(g!`J>mmOSx9y;_E8s<@a1Z^K>h`M<+o$*rz zH99rAXok1=skT3fZ&eZRWJInkrUVnal*II008t}RNUvKt4{_W3y)LdMV0%Pv1EvnN zWf?{;u^3@8M45bTKudPJ!juw0Ix>9Dj_VW+2E;t(2qasDb%^&-dVAkxYOIE~J-{dw zra+)Kuuv~S(v=Y+STjhOAt=J(*rbk;9OhNnR0n=lAgJdcyeaq?`dI$tjSTimmWY_q z1R>v4eB~+xoHRqHdvjv)Udis@qwq9~U&!RJA{F>5(eEHUR`ByjV$5j0vnhbUM4`gk zLMdx(-LH^(qsCXecKPyGGiGtZcy8Q0>#E6L{ruec@Di`7AOY$_Za{S9A3Y)HPCZ^B z=E(aSb)ESsE7bY7&c{2lj=EJtkhRoL2@)KRI%wzCZ-bew@ps&xi0i!wULjtp*=DUG z#hC=VzBj-?#jl`j}XW$aS6HuwcB;oN29Y&+=1fthO(5ZoN#rWm-4KW!ZV3`z= zJn>lEdE7QIKM{HXst0ZfkWMjKNtjKWqasu5BDUxq_7uLV*yOQ{@Ix>e-=UQ`>Ld0i z5I;l&h`8^1*rm>`=j+FQ5AimQNyOD3p#(vSUdH0wB2e2r{_4Sl2fI%T?z8xyq&#&t z3Tb;79KrxJ!SCe~pHDBDWGY_dw7$G;j+oqgHf4qz)b44nxCstc$Mlx$gJLUcb_sMTkq`g^2em=) zU(V45FO{MzIf$jbxCnN47BB4A!xpjc@aFn%xlTO-b#~@llOXGotfe3ig~|6@_j_&* z4)f`0(xUSuCD{^)iwaSSj~zjpfc|7G70{V%G$;MGO^4DCV=L*Ph?%Ue>jRhy^`UB~ zyd{`uIv#}t5es074Kp_y-d=r9QS|?t726TvD%A9MR^18AU%Nqk8I?!>iO%~3I#P^& zF98j{MJKAO$_!}4W(__jM!27{w($PI>qKTN#224Kfa4&BYlUQAKPPz8q*?XY>%f%{ zkC+#}cMA7!yYedRdJS4RN)IFKf#SlT8X~ZoB<`$WOoaG;+R&lHgyDWUAD?lvuZ{0c z?OT`z4XXWx5<)oDvfV#w{Y=tB0h3T{9tBh)w92>Bdb!B?Gq~z=5O(Mm z`G;b4u;F=&3{DsxBu_OsU-Sdm{G~A{9m9_PND#^7m3{AC!0heK-A{Ij-HyLZfh#MZ zRYS3>*ZouoA<5jAi$P+Ft(N9rUJyiP!7`u*jf3n#F#vg)!dK`E%!v-YS@}oOrtJ;8bgrdK7pd*J_Adx{>@?CUenBXDd>J9 zb>LAq8kw{}k;)(UcXoksekVLJxqZ+(82&Vj=lx;hV)8mFDvCEei`32u49xDA6~y3( zX|bAwzTQ!E3^itFh92sDS+_j}KC3t5HILEg#%8OUo(potP6TRO5jI;`0+ly^03`Mr zm>eXUY^@lRj%jE})6mCcOi8nxGQjpLJwrj&28Uc;riLz^+20PFyQstx9U2~|#Uvg@ zVH-ju#9u=)`Gi~KT1_~I@nXa`vs7?X@cL+v7#QM)B4$vj0q^VnJX{XMAAD`)W+L4M z+MPv%HTHnn$$2H*58Nk=@*Wt>D#)uTln3KvDP(8tol~IeexUV!2^7mt;}D+q@0b_y z;O$dwjHizlK(gwub_E^h;&Gth;wIHnN=25+sA_v$!Nda&YmQULc#J*eG@8~geGF^7 z#BV{t$d90-%9mO0m^9XvVp4HaJPh=T#eNWdxVx{=N7+@`;0nog^CR9!EpiZZ2uh2# zk0(O-(~zZr4(S^n0i}nMwiq!laZouFns-SupXHVfB8XrAGj6j_R>agw>~+jd?iU{l zFZ>+0tZT~ULwdlsE|AX1J~;(RlyL?3U6`8byDUtInBcU>7SP^5!xzs8k<)Z!0A;B` zH+T@s^eh@M;j4q=U+}MCPzi7vQU!mmn7sCib>VU6ZE1+2@s+ZR#>MG<$>{9DS|lz8 zq{-QMLsfW~%k(sRDb^CeduV9rw8;)%KwJAYs1j5P6&IAkHz+PdJLP$bu!qOmAcvud zEtt&Cpo=*3{!)%`KcGp<6F?1B#U7g)Y-EFr1UgZ9WC^7L;#cj-9fTs6E+2+uB&o@Q zZ|k*h$O*&<)gJ7n=^=;}_*w7T)FGM(DUS{4@u&usxkNkC#y zG$9&t+>9qiNe*y!`X&^w$LKS$qGnvr@0^bn~%EAai26UZU_9Ou$aVTNR~q$CR5tp4>L zFz2^d#Dzf`Vy#pog9Ht(JQxDCVA(ncxv}w>lMN6qxH!J>LbfsaZCxPgu+dt>4M80R z9V-Hw=;6qPbBex5au#uz!azV7Egr<<^j*i8cNB~jUZ>1;P3RB*qm9iHGbBr|S4!1= zet&2h)*rt`mR5*6h;zgzgdS~VE%uwHeZvO9jb8+ z_v)9y>VMKq1F`j^V|;>n5YM_Ynzz9w8taS=f}6B(knW%(F&;~8#mOHfuv=O6H7e4F z2B0qH&R^*WsWat(A|X4q$Q=LzEI$#b$Zs&dNas^r1QcTvr{hbgs$zO8=G6j3in{bT zC>bmqav)9vG!P6$xgPDy-!7uVHNAY%6C#GVAvfMFib&;4CVtR4VdiHm6uC)h@YZwphNqfY-JGG z1hT+pVHJ*AgoMFZoGSHHSxxFHe^yX0FN+;qIbpSfNtQLed&4%TlZvVLW0 zYXqP`NOnqBvJ#k?qBx6I`~U)j=-J81oy~A|s>0?&fDi%*&E@%65rKaKOTt4~wn^%m zy8QG(L3_KdPz0|jLjrwl7~E#qU!K;OL-IhK7_gry52G~b8?hp`vdqb*f~HN%{;jT# zPAH-nJZo#fF_Gh4u@vHK8kzIQDUyz~b%?<+*I@hOBjVH0DHqcDhOGF`?J37io}!mm zt$<0F-hj98OAv95zTzz^;wUnzLeWp1Zy##KCMq)?g)f8v+X@8;k>Kb=Lml1+zlNle z1=J!y1LG~pw{+=CZ*OlyHuiwGsPg2LmNdcuM*3MvX>0?8*tdvbf(-%uH|QB4hbc-Q zmL!aRPR;@FJ1C%wNego81fN%kr_3yv9W5-ZYliz^tb?A#Dq%#PXN=B&r72e^-Up$ zYmj&(^rq`Uq3&b!>xii~`65Yk_m6NjW{b>1fB%uX?%3iic&WTup5J%`2&LKuPcxR7 zYy>s3n0gsET2Ui^0Mw+IL-z}&;N$@vTPl@pg1ejI?;%kU)k+8T1|E%y3Gbp@kpCVb847T*1nc!O8pnPbchJqKhG25Y5u1dH;;;w0`;H}lVC}s|65u`dqL)gP ztD!%SqYR=g>_fPZ3GYm-+peTy<#E}vnE4XP>%bRtG-@Okl&l*g^!+RGA(#dB# z(cS5VeuL!%j$@5t^tVV~T8-IYNX?j1otnCSzRzk!+G4J?6?|C0botl;K(mo`lXc~1 z)Qenu-~~J+D+ZM9DXdyQsBWIFTO8n2)e^=|w}&q{H6Wo#SzTQ{ehj@CA76LdRv5a) zT#!`LjNPMIwV4DrFmk|@6Lo~vL6c)Vt5aG=DNPckdZ%sAg-D~7um~S{w(mz!5jvCy zfOskQwf|=%cJ#qfX^cMo$yyjXcIp z#<4mN!OvL&o*;h!9lLk_PY7IfG%;4yJRgKGhjHU729Lh;d!Y3_WsRg?C^~0|EAm~} zRs4jP-}bcIJ#cU;o;*vI)Y+u7rTc$}{?vp8RJlvJIF*sw!@A%X+g^X`yJ58Pkryx}f z4P`3mxwYWi&xcUhESWEo)L#SsXhkv0!*P8m>D6{E>nMYd)wvGm*#s{HWf z_l(BYv&*%r-x&%EHEcb*v?zepPa-lmsZP@v0~-Br$S%Ywj!+%nO!jP)JAeY`J;@rc zSPJ?@Sh5%!mNX8mA$FAD3CN3x5K>eQ+_`wg3LVvSw!I-H4Ghwd@LR#$1*|0IT`mqY zjKvQegg>XH<(34F)d6hv{)jy)b5Lc zI_|uZ^*amKh=b>g(HX@^WxQz2*XzlX%kvIZ818X`x`~9g#Mn#Z|D6e_vZH{LT!#rliyXO5fi5 zRmB8K@0ajdXYwNag%XUCL~y%%_KG@o!h*41jnBNT(OJ8mdX?FY&k$Uuw+0}8y4^c; zjGx3JvFZo_){#+AHo20-cMs)hk871lPwbVFj}5nq2K^&xue&)|v=8cjiDD)u2-WHa zsJQx5jyq3|=qdHYqr!U5N&FqhxaCOzyVYJ3F~blY8+Q1b0gLGqnT)I#nk$_`fP{`z zifr;&Zz{|lxYtJs!p1}D>a}Cr-wegip%hWUHgG$dGWWC)nVLTU+@uwvF7e!MxI-h^ zBu-OOtNtwaXhyC5KLSMAh`oRvf)j!p_g~nci0&@#J~q{FTrY8!VUc#gX;4Et0lR7w z;S5reO@UU01~d%6p^$#7&3sdIO$Cn$hcjL|mVk3ypv_B-h;%46bXU=o@QFzEp$3jzAaW=VIBIoz(F9LttF2~5Ap7|E)eVD(o8n?Voweybf|HSf)@cYj5NrcxJCrO6AtI@uf^!GKlvskU zQ1Y1Ub$3z8!;5#0)YP!*8j0@T-<5U^D^%N931vV?g%4O0prf(M;;!pwUeik@MhC3g zK7m?1+FuT1C^*z_V3r1cYP(;haBm9|Gy&%)Kbs_S^;3X-cb7fU)U?n^SQlsbB9K~ak;g7t%uc)50 zHk!wgFcY3wTGDqBMBsiEL@(crE3XOs5bHWpvXr0SWZnfFOm&)=Nv{@Pu?^_*j>OgS zJ)eYSPlOTh4EHZ|z1%GY4}vt5c0@wCgroBuTwXy*a{d!KlIf5E`x;EsyICB4xJZ$P zE(v~hB8NOXpH4=4rDoOjw1!s$G|Yc+9aFPDq;}5Vjy66qFsT4p>8=@0&hz_I$o?2e zk#cEs@UL{}PJrP|tgG6gVz=p9bdm9$c(2La*3XIIkPf%d$BydI`r78c|S0%;U^cx zABFc?=-C~EF*>BlqtT4Zp54@y$1D_8o_42K*erBRsqyZ$5lxBr$rzM^&O>J$a7x1c zDGXJf#qRiANa6a7Q;sIQ?tg=bqu?SiBP@#%4R>;xHpJvWcaD`rsu?ugmm*kQRVj>i zdyt8%8L&w4jirMW2feEmAGjTjdF=g^p}TXgRUZ83aG#`)YEfm3h10M*qf}<^x1-tF z*(xC^oSl_7bpUJacCEVU)CI2=?SxK6S!ji_JBW*=Os-_Ys?E#8eR)TC$l)P9iHsrQL!3TXzvd=ena&vDBe1(Io!o&=c92HX@GiHYSmeeB)91^-><2kd~;&G`!$~g zK00J9EjMd79=4IRN)coGdxP3iMo&`(t7->VKAbtpSAlGh=mF+N;s$W~@5j;w;+sCG zzXtoQbp9!L4%HjiQ5Fj0C6X^6E!?2dxq_Xpfp+{1b{j_`pf#(7Z*9hCcTSYb*@0K_v%5M~7dC^jEqEbs!{*BxO<& zXuypYrL@QoTiqXZh`8p!N+ELt#kG(Ln52;yGRTycbkz)=9M$$jnep#faj#*6Z#!Y! z=$M8UMUvD%(?UPS&u(_$j)+PN^OP0|GHu$8Lk05P!#RZfEg9N?Pa;v_>}J0JN@318 zR>_n^YDA-HBJ@@A{bs!sI_TQ#v)QJB!HUGacHIMJ);z&B=@!_gG z(Agg4^nk$swl)8U+M0n5_qfstasbEGLDCFUk~|+HBJDl8dSu?B+t>HuTf5e`A!9J5 z`EO?cz%hjW+puJ(QgBb4-(mZ9Ok5eyR7B(@3t^Xa|O!&!~GV^kSutHIsd}{=P}F z^jR^-=R3&MQ}t-cScF9LuDDbO6HBco!B7b4A+I_Z&#v_?dxZw1e6r!=NG%;K&qmHb z-VkqUS^rrNNS6W|_E;8+bU!dSZpa*Oq6m4uDM!;`HgncaJ-FpH;kJ!fLHWX;CM59!m7XVHiStRgK+_zmF)JU-2<(TR8&injwTsT! zcHRI>lkU&mFSCr2YXP*8!2{>qz+!!u8NU~BISAM%GA_=zKcKU#*-0*p7B=zQ9Y1%H z?gd@X51fk>{I7Iz2qzPRBPOj!qlHGq zG^O(u&z#QnAoi7rWs7mu_H-?}E#RT(cVJu#JdB2J-g5_JWzg}MV1#_Qy&}$pdepeY zAQX!{>hN+YLlA2T)7lm|($M8o0%24C0MZqJR>hIa!F_B}38xtLJO3LzEWss*J~d{x zl0SFpf_d{!;x9j-k7q?Mgx#7raE(;kl8w(?E#q8`kMZxY-|qw47NRr^+*~lpXgXBZ zyHipDCf*v}K$v)$E_SJ4-RR88!d|2dXR|X_*IvcK_jHlNuDppAE0|~o%F-TofxwAMd2fBrot!Ws;%9^=ZFSQV1*%7OaS2vU2Y%go+9e z*XHtKjpVgE=tK(;fG;pG=VwWnIqXFo57}^hARUx)uT2EQ2&aYcH|oA`v@%<e=l3Du<76b`d|Kw!sWC7_^tTk#~Tka ztpzr0sPC3U1zA#}c7suR2e9G4{v5gBZuwF|cJW`s_G57jX7%vDeecP-$!8lklwNZG zuYC{bV^04ufz*i$OmTjQ*VeQ1SFT)XlCuZf^?}8+zr+Hzc!^R~`2pW~X7hXbeRL~u zFD`@M+zf$ZM?dzXW<3vg79x zNGqNmslj3OuqnF(evNu``*!OCx|a#p4h0=}wBc5_15lP)xFhE-T=?g?b1T6iLsjoI z)J!jz*m@zM-w+~WJJ7lWSn-^vhyNxq2gBvkr40}(od7X_By}Dr@i%{+;#qsCW9r`D zN0BP-;4%)W&I0VYzi}XQBh7+^!vgNW16&U*<`=-;o zK#jjr`fA?x3s2YvMZkar=FUW<{{khYTOV(4Hu<^n*_(%eulFIM@&+Was^x$$d%;LO zN5%bx%&r}fi=)i0#`R=EJe2cko}|emaj5z3IK6=WVAYmJT zjLE^AeG&x((48}SLud*PbS+aWduTMi( z3JP=aYh3~Mf62qg+oo#r^l;AOjqcUilY8P!;y^Xi5vjQUGodAS-aZTygI*M<^l>m4 zCQXyuZx6auL6g1{HZG(^aRP?VLSKCg2yZ<&yFcvh_iY#Wgv3Zq;AZA6uy1e zu4NDutZcb+?_NH0cn&9LJ!Yv7APu=Z!+z+GgH_|~zmId$_+c5?iKIn0bRw#Drlvb! z-f)BJVI$5@s_o;Kvb~m=n8@_K(F6#m^?T?tAeet4$XX&k64}4kfp%snx1F#4OX7V- zVR-^YeJr2<8^?3pqVA^jHR4wmLz4OcGOx6!V;KTvQ&woe<&mly1yA>zANpUcoY5cC za|DBCw`BcG^@{>{Ri=LN>_Xsqugq*faoJ$}dvJRMwrrV)N6c{zrnQ(Q*kRs$1@peb zb=J(8QPAK&9t44NAANwCl(e+8R?QU1nY&py_~n4D?OsH8V>w>O;W!syf9e?+_$xd- z{Bk;;{0m&$B>}|9r}qpF{(1SbAYu{b@$>WV-M8;9tEs(Rzenf!AKeSo)YOn6v;n!U zmy4}lGIcQE{sc+S@f_ge+(nB>H14fEg;k)E;mqKsYB@(f&rk9LFIGpW#;k z^Iu%fgBbsf1Ckl%AO@E7?c0_)+1U!8HXZf7EM8-SHvseR?><9#=cHV03=M_h^yCy6 z`;rFU;05~MsQCCpcx~$1+wWrOd|_5_ARjc8+Ytj?CI%=+nxiuO~>WJOj&#~ zp{bGIv43sl!X*o?;a;@p6JG6wW!RL$g#W&4EZ_wHmZ^n>90a@zIoD#sxr3$gv9NF< zp!_EV1|}vZL;K(tICCUe0(%M_8p+8n|M~L*V8|0&pK@Ho#?ydbZW5b@GwtU|NJxC4 z(-=JV!LbDi<;ISVjtkn_8=Fm;PD^E(nBq!c8v9vM@$u6qPHaxs!ox)<_-RMeQ83|# z>xf_|8^xiu9Ju%SHi!8+RN@WSR905@AdYB_aNr)JwfM^p#B_fdz~og&s~q>>1X3AQ zR8*b=Lb&qv`3x9$d>f<}&6{@sjLk`8U@hNvjw?Ps{uh*?*~fN{qB|^sMht0e;o&D! zZOxDu%Z-OF;d8Ube`2DiP7Zd`)gWlEJ$SGXyC0oJfdixjm`1+e(kGzUsBLc66|ZW< zB=9xPK>25R`3p3ev?s#$_MZVc!lUzPi zXzonB(6sv^je90OSX6ZML1>8uC5FsnrdkSoZsL`tFVP*2i^D~{xsIuf$7%Z?$JkSF z^qN)RuR8tJNfz?L%#4u6q4OR*cwqJWKSAHliSv@)zr$Iszkt6l;F!B$ft;)?hl~H6 z&yF*ftXR!)Bk8pUhTiPaWPU9zt;hYSnsXt~SjsW?aPXtm{~Z)ss`qEAXt& z6}&>?BD_S8oS4XI%ISkn zd;xgS`ovSA%W=$3!TA={ihKP&yNbaAWsf3O?dcQA{reYi{DpPg6xK;ZsHG%MJmj3> z4xK>o7-EQCBp(=wDOWq*?#58D-4$@SOu-0;La8Q~&9(HDHjvbJP zO*qRBN{J8+{-=j^qAGvv#bz^9jq@%jmA^AhP(=^5SXo;aeVe4SflBPRK0S=a z=+6kI*6^5un=sRCY%_{r!$Nc`BLh8p)wUsD92qn3?(({uo2c>Hd&S|^wx@@W z`0ZH;0^-n#6N{nh;lv_;UyZ_-&36ZQ&N7GC_Mr&Fnsf#pBNqpp_)m0dlUVsq) zt;}=l)A0sPvGwkmm1R{{HtdC*RAh0swUaU7wW8 zBrm;hC1+$phGaM>qW>2*N$Mh>h-$3Gf>epUvIMI68|a9Tl)n@&LgDbJUsk2T7XZ$M z$zA&H!B8&)Pf_iYUL@D{cWkIeY|Vi`F7K&U64;u`NI-*~Z8teFtQ9nf*Y5X}dl|4f z*}R6q|iuF%(mRY5p_j&j0(MH%z@C;AWMJ0nW;{C+DfbeyDD9>?{+M7SB(YPkzDo z@_fafbDNh(R|ld{?)qtQZhttMXUPcdV~k9zHSLcgp8ER>|N8Z7E>6^moB`E_`$qelR`>O{*Y-@A9uFaU7#T(k=H=1}n%n^(mi zPul$S@Oo%AE>~gs++~U3U?)XYNLp;y#UvznJ-PbY&!O`xQvJlk5-g2}GIk~(pK9eF zYkudV>F^5aqF+LD(r_wtv2}@5N`+4?h>$;x$oCUBd&W1X0 ziG?#ZgO!w9@x{@G2D;z=WG!3yxl2eDM^GLKkXplG3dcq7pU-iX%Pm;?{bvmv&PqFv zt3(&TTD4NvIzX*T{Rf(wY%~lrIMBB)dyReguUoe+(b?~VbPO$Cv0EUwl{ELhVVy21 zDk^%{DSSS5^O>zHIBL;T|81^?lUwf@Nujw_J>G`~?M_y5XM1bw=B^+B;LATJpI1}6 zx7`A|#kW6qoeMvw4Zj8zYACT-5`8Y3n>KAa5-7b+);hfhBibDube}8Oz@An2M83HnZt4ATgXB><3J&=qq8%odLYsvKV>ejbgEkmWKNJD4YQK*lJ>8BBu^VwiBCAdzQztCOv^1)yYB47mc%O6*38irR%1w zj&g_Dw{IUoqu;vj1dg}x-*2-Bt`3}qwHgi=ZVr_sb0O!Erd4|u({eFGe*Y@hxa*|i zxVOFKd-|)dEEW%kV5nH^b;}9)9xxHx7m+oGw=6_^hJfOlSsY-5J^}Au!q4xHjr8M} zFN(rA(o-7xvTf;mF?jS{@=5w2j0G1G{H0Lo=mL*D3k5h(jDCYH`iZ0EX^+Yjo8$O# zr5K%VK7PE6x+K&@xuBBepY8YW->(ff;B9yJTnLl0Nloh*{^8JR%hMxBFyY`p@^ZGe zY(gb`Qza@<7iIwYz7IBn7t)a&z>OP4ckSN2TRA_!pkTR)KW?-}do+n7XVe0F}+ z!hYo-1rzc3Q_(RxddoLCJDjnxy-cnWjF>)m4#XRn6UeuJ70#a z&%8M?10W~|hd;w%C6?K09CF%t=%^;u4SYI4$?JUg7~RDaAyt3E;)J3dn2CI>DVhLq0^^^=K~taDAXfihz44p z*`iFmyz!hR7lnPABig}p61Xk8(dCYgj$gx+x5Irjn_~x}0eUsIS7fG~55ILNXvu5L zj!O``e+_jUh2thfAiu#i`2npD$K^SviJZB~K8;jQu66sC!myd=&a{Kwv-O z=)e=;4mK~JkN;D#r+j%;WomP?ujrLzhA(8ZN1M%=&2e+CL5zHG@ocJL98m^LQG~4E z5U@omar!INH8ix?_6u%Y1IM9_$>S$Rj8{i^Wb^O5A1}2VgfRPV77&zZ?dQmQOFCbT z`4@`+1?2Fw-l&i2dhk~H1u)xar;A6>>DRWj zxZ>J3?Ay1NMp-mFI}wu#qXGwwLQ~GAX-OB}c3$hKE<`cR8-^Y-`ZrBYO_enJ-QV?h zW4yQl^GIe@)jEnT`1x4oHTx7iBbOys7oDM>&N|^ zr4f4OCAO4H>#Dr2|1Kn?ciMGtkk4gM? zd62ctb+*egMYDF%pt{z6?2hIa+G80;*y6i4zs z#iGUSgSN-*&ADtoziX|X7C2>uvITHSbLY?h2+{b~u%I!1AMANCC75JdACz`Jir`tD z5EqvNIwJeKB?mf+Eo~Rysmbizd2*=&VMi!QP(@K&iLUnEjAU%!-f7M#q&H55{sFE* zFvA?3!;;0w9iVoIY%rEo3{ia$wBy+VbNrKT-*xxPRf()Hqp*i z(Hsglel7`Efsctk+aO0^n9=vd>|HEbqY4^ugDlj#_4Z16C zco^vz}@ zn=bjj2oDfj^OMy_$ZYZJVA_pWtm~viz3>dOgL^Cpr(a6V8AXlX33Wau7>@uhe%%DrmH;)U?470m#fOjn0fTt(piEwj=OI5~3i+<@@7G*W1 zrKgTO=mWyCx==oVX+X|^S~lBYNPbN4AZD)|9jE}#m2zT^#ld}+3ni^ z>JA=BaQ%Q+aq*fpchClXEGjzYIA8~M8g=67uQ{0gimCea$|zUJ2otwa{R(WZnTpIq zO^i&`kpZ8&nUIhmeAE^3G<$jBWLC3=<~nC!Ma3~rC%SW7V06FYl*M8k0C$I&!Gxa7T+B2o5(`W)q<;uslqV@1%C z-$GBqGtsyy@y${BS(oQbU>N)x7r#MFY$@IaS?t)b^xOjEce}F`J0P!&GcTA`03HW{ z5|anD*_Vk}AW6K`o2m;Gjvmb+7-Pz&z1gU&bICrC-cnAZ%h7(xU$`Iu)$!8?YaGcw z2gBDaU;|MIt^;FH4<=I%XiDFA(d6wDyn75+16*^37sSjV?%A39^XAUYgd=0|+O>Ca zY4t#WTFb(Da7_3D4(d(>pVosG$+^hQ%`FTmsN)hHn94plz2h0j_%4bV&K$mYfbrWu z6n0K>3P|$Nj)A<4yDhQ@56+}7*Iqi-7h`g7`IZeM0f0k@hEPyYxF#@H;mDCERl?t1 zp9||9XgfXk#x+#mTKq1+ZPydStE;O$UZ3MCPcY%9%f)1L$B2iI&kei7U8~sRB3!F? z$a1ZO;j9?j-G;8}w0mHFpj!|S7hg^fsOn*9S1~+}xM(hde3GnSRD8_L15!<&v3`Lp z^x8B#f7$)5aw77?=Iqxe08`!q1gL0Sv3g&GdCX)5Pas;vR%Rr`(@8hsQN+(*-5G4$ z6_*VZ4b#Q0v7iZ~_fb)qC?zv4XJ}pc)l-KIp$}LVJ5m4CQ>+)t4i!qKE8V|s{-?mp znX_a+7hd(kj#LyhK?C&S*#`*pd46WAkPaphk6!d4>B~B0v7wqwb&p{4&bC82^9bvP z?si!VodEY?ABwftxJ)bjpB{Z^p7SQPbXpr~YX!1%a=v(GfSWq-;)M6^j7b}VwkfT` zpL)PMerIW8#GlFW0&*nIdVyUl(ZLc4D$6- z0NNyeYKBa@n-op1oPB^!*>Pigz}r(+v$?rLtuq$N*E~;hM#fa^P8g&8Ue`ztW#_1< z9&kvHQRw$S_m0azlX5u#z-N#ZB_di@p}{e)ECRQo-Z=&2H$QLr{J$^zo!NReplk{w zU$pl3uPsn_*(G~6p2bG>HRLEyPz|+&2g1+wcc0skw_-?P)7EV4o@R*I`O@&XLVk!A zJk$zv(B7=bkF_a#dRPduEH{8k|4~3@`S@JdbzbLr9PjBkJ9Kx|C(yTzM6|0l>^@(W zb~!LvOdgtD@_<_;CZqxtC)&v$s9d&mShwS2)^*|a8hWAx`h&(Vkh}?*{DsQLLjCX1 zMRY|z_*dA=_w{+ZAuHsy(trUG#>wda#WazznPoX?T_hMv(XoRs>0}}R!P*txS&}Q`zvq2Z?12#4_ z1zd|fy_uqthGzSjGiQo)0@({-6FZ*Oarfq`PFDKW-oM+I{Fi+JeLq1+KoEDJq&&cvGi-VC^4c+dq+7Sn!!py|Y^VRBL-Wj4w>H5bekv|L z2z2}j%2&TI%JrAP>DacXQG3lN2`A9$2^p1kIP>7B1L;|iLxskg=U~e2+_&#RV8O?n zFO;`a_zSaTB3G?iWe1Kc_VlZSrWH*KV8Fy=j*ZBuC+RJ$Y<6MBKDw+=Yeup&Jd}=t0@y254#ZrZs+1=JGtF36xG?mg4#l z_fsVY0v+&`^?iOKAQGZvdd|ZBp`-;fDx)I?HQr`gC^Y+e-%h4L>>|+$#R;)0u0-KcRZ7za2qG=7Y z|FTb$+}YGtUG!Rez#&=yo)f%0o|-@Tp}V^zV|W*IU;F91zua|mM_Sfv>!>Bcy)MrU zIJ;`Y`$vl7#`U1)=o0T}<|@$LMa!V@`2QRo#~8Gxz|4B}*+GjQ#mC35ZOl(UPu+N2 za9vqhw{T307Ev@O3}tcbR}%>_{g`Y4Wp8nyZkVPhc6;AS!SXrFkG|V}{^YY8UB?^{ z2UA>5xoc8l;v?FN&I$?#SPXfAK9i=<`?gowYGWwwISY%t%UqqNU!8bm>X%20QQl#0 z4H4^WF&l5#e70KS8=wD<@Q3xzf@&jZaLU~qjg5`SBz7$b8dH100I7 zIflcv4A4oDMEVJP_~2|IL=Zomyh3%vi1y;$+O=y}MmhTv7Z3>X5Z-tLlIdjdk+WyL zk!;=!{!&9Iv#t-cP}7_?=MnF8|kbBDjG^ ziD4D`5D{7)!^6C=rJc*ax6sY(;>PZT4sy-vz$*1 z2(_|KlIUJvlE*=cthN`)_6Io-XMVrTji+3F_h3tir89^rqX9NzE3K)k zO@4Dm^*^b9tG(_ZfrE`9-{c^=2!kj}*N^nMn)aXDz?TRj>WEF{=Y+0yr?^xlD^9v8 z^uIjtl|Lrjk)HgldeUvmPwp&~xF_ZHsj;tU7SwQIOLP%cFq10AGe9hq-bH^N>SD^Q zC!f&n8l12#vC+}dF?v-@_tf&)%f6<-c^RSLhkL1DALr!sMhnN<))6cIaKR+QA;Jqv)$#5*D& zDylL~}BPy8}FdF_}Q%!5x9ow+sv|JD5ZwGw}I?&iXBG$5>IBd~<0Grp2p6_hdA zLE`J6p>-)*2&kMhZ~iOdidw?CxE&mrOw^4Cg?ax>RVE-NzE~pk0jN4?%ck6kx=oUg z`Nj;PI6+_3LPCnjbofRgG?K(nwj|TXN@7IyPHQFcc<^9?=sgBb3$5#(8e-O;jGSc; zHjg9cVNfMH4}PB{Wz4YS=g`=77cX7`?nq z9{>~b{RCWIkN&kQ+^oUBszVr;Kv)3JTh+S+hp;AdH`uyMnxE z-($GsE}jL;>2_l{wOUwSaaQX#L*r>qj+sI~K!=J>qh`+R&}U2=-U9doX=EtoHa2Gp zt0s^ftjQ_8HKV=$_2A&Rm09YLdxUXyTD@)0`F>5|D{X8>hVK=POU0=F`l>Wk7K}od zgr?jTGkl+~>nMQ=i(|Rc_K%QRb=S)9QWpeCdoyyx#1QdaX}EIlP&n>?EErEln=6$U zR6X_Hw=XgEURI>jLIq(T2{x{Nu*$+h$b60OoAHiGVlpy%v*WIQwG@!nIICOp@$mRx zvF3&J8-zfJYUWz1CWDm(&2ZV#&fZ=i)WB~t($dl&d7`2YB6d+$LUZ*Xxb?l^RAEww z&h*hQMBtKp(@k~jHfqV2srPp6*|YyKQAip_)pQ+B?Jiooq~{OuYTh+NI#NT3|0-&m ze%!pHhXL;<2QI_WyE4*5o`upv0*kSe)q2!$F!Z2UuwrUx?*6e8wYBXlO?K}np%Ch_ zM-0jyogTi#*7>1S#`Zck=Bta8g(_@FVH(Qnxy2xwV+9gBWXO=Efq6P-cB-Q7hhf|PDmlFmpKmDlLWRm`FlKr_3!I6=;{ zS$?g1;OMeF{h!4%UE6-UCK%)Y2EWZmmA5o|Gw~Y3d7V3V>jteNeY^YwBQ^(;7!w?U zz~tj(L+*j4^uIS_k)oI~$M@&^2C}+%64YrM?d)1e5MsBb?u@6QwX3hOlf>XpH(z(6 zNoR%dir8(XZLru-v-CXN){nBX7823X^9DP8v0=2#REFU7k&K3v6v;xtzl1VQq=yGb zP^!JGb|wZ5(neXgY1a+$Og8*QJt6MQRo!mG7fAE^Js}MMz_5jccS4r~v3XPInet$5 z5*=r`VRR-aIVaXrI%GR~42ZnmRO=!cX63qdd#S1ifdaAX>BG)!x?9vjO2(W52%PdM zl#)nE1*njq10$G127-7az5~R8?IFNkrqm+ykf(Bb%-_F>)drSCY!8TQB$9;viyiTY zwifU8p@vh(jt$PPC`i55v#}^S1{rzpD&eDka(I;K2Gnaxs!~GFOCf%Z@^qlo(w4=G9_TgjWP{T3~** z&|U67<@}+@qhmC3(E0tRpG-Ptcq!KZ+{yY?vsK3$a^vmls%*H=F$LOaDQei2%#xx< zV1iEg$pf&{3{hP?n3q5~SY@Y1s>$|(ZQ7q2n|!WRH{4k@0ji~}I&$>Z+KS;ko^#1- z=iRcHhW;wb*R^PeqN1{LJ6?Hx^3CVdC)3z}I(FlMVjHgm2jZZ^>C5_`gAZaUqxy4O zRqWJI>!>+lf|R6V|4ALTY}s;l7zHyez?K{BxeH}`jyGdF^%JkuBk<@)M2|!wV6e)P zp}z~>7suc463f%e>!%GVClU{u|G%2|l~RR&SFYEv95QNJfX7kS9z8gj$6u;&dGi3} zXI;I0cHa`cY>f*$QS-lB_~(QaHKN?%wts5N=3kzO(fzG~{@;I?>@t#Kvd_WYvSl)n zuD^T_>gsK1HFI2x=AV{hN zi@Kqa^`yCY9FG=pir%iXyJFHib?yG4ZTx+=+rO{T7Qcl8Dz0-&uFb!_dNx{*6SCKb zjvOfq$tN_`h+F|dg^YUK^9d>lg~72slXX`C+5BM14;nN`O6W3{ze4H)+_ZIQ=CDbV z`myDAjqlsHuU%o<$lLkV6%}#KeUVv&LtA#WLvNkRa$9jRd*b5s;H_Fi47^Go533+e z8K;ZHTigj6(T7XpD?wglSp#<3bZYeUxjEPM7F|`l+rIfWMyb)fF1v5rcM_u{SZ}c$ zV3Z^A1XQ&_$$FrdT1(1}(rpu%9n-8l<|yR68#xB?GgA$E3!Nc~bRgpopX<4foxmG4 zWtEl3jyA!WA!*uuagLBn8%c(9q42bF{?{`-PtKB`usJv(JA%2;63JF4rxU>pJH6V{ zCG6*3DEML#9ku&B0fnYgZ!vo2`PnVN?7oT-w{QO?EH!r8z}GzJJyXtmaEOV0 zUC`P>RLJjcin;-ev4?(w(+$1*Yf7qj@7@U_Z@QsjqRXaH-*iU);8*3ALoZD6p^s|! zb7x*(n|o5+7WY@vxM=20cfyUeHuUU*pq(Khs(eaz(!EKDCD3&StcpT6WX@yCjZS{E zcFZu7h%peOn#JsG7Pb2ziUS2%^%J(ooXzd#ty>AzwNNYlxZ)W0*|>H5NIWK}tpmS& zWPu@(x@CEiOQT-fEdX%pB1(5vpleYLdRC$q*hrIDPkQ9dJFZa~CPM3tmvnDltJL;x zcn5sXHBfRV!}2TSPoQp(ZmhMoGd@4>BLyX>O&_iSy> zl@Ly#cOb4VcB2Rk7wAQ<YN|l1$)XLIox%gG0ub7VMo|0T~g9#=*B%Fd;rZ zJ{i9*9So-=C+qGYPcA7D=|SR=m=07ChY!p>q25X$&8eAi?v}1(Dgkw@-X2m4PBS%6#blu$LZtlPIg@diGrN^Zgx6Q}u-1Yq{lYMb@aMA3Qe+F?u~ zJ3tzEuMYJsGNLY(4`g$M%x0t2MKY7Hs))WT^xiNPLHJO)67|*xVq2z=Oye0XKeyY} zl6KH96*);9=j-4U?THg#EcZd&M@Zt{@Q4=zaO05){Q>Q!Zz!EvLRk3ZY#|cllZSYw z)k;s+b#>Jy4p=GY+Jc~S3xe!VyNh@7>{r3`anwE;$D+S(xee~s3kl&$_Eg_51+B|u zp*y@)yrS184`iiuWmWw3es@TrF~GwU7NTh2(9EN6jPxtC{QGZZ`X_d@^#Ip z1$*)f1Xh|3#sJ5|&E#=}Ssc2)l+9cE?(&gATR8DEYHMn14Zl|uXD(e3O&-ol3a`*# z^vTi(^^cUU$^*OzwJLO5erN5mYdK+({+xE=gH|2b1h7}A?+q7}x zp<~wRkF&E)pFMllxp0zm#f)BR7CS$F{;YK33ia+Iz@=3iCkjOa45kSxQUB}vtNsFu zSE!zbpJDw(j7iFVSVYY3&C1#|HE2sX@T@s=dL-fK*hSxUqQg8f zS0}jX=a-pB94XxnL4Z*#%u%06=CZL!i&U~g@WVnU-s#ZWE%x?ZOru@b-MkSM6?L%$ zp}NwSh{-yVP~E>IEBS`V29S37OV=X$8r44L#0W*j7|YCR95;ea<8}UsB_#AlNj0#- zLtphQ^P7roLgj}ArapZ7OH7-eqOJMZg(Rbz75O_*p0$r#)8VvN7eOC?fwj{GNkbC z+T@m!&hqm6aXahz#Ty6MnpQytSx}=7DQu$nmmJEozgy@693$pH#DBike3B$VOZUy{AmwZOsY^djs9pXZHO1-Y@2o=bd?^jGi@8135 zqr~%b%^22P_;o){vpe(Y&{@aL$D9ieXp;A+2~8H!2$wNO87rizrpWw|m~(vk>e>rP zY<-6M(Gg2KBF2`J$_5>QjhxD*T5T7mm^`Mzcp^~%0zod)Ng{fm!Ii`fx3J7VpZ02H z7K+3`8wWPags`Y6;05giX(13dmc|;rtdzro7Af0-K4@xbMg45hCVk7UhRwn^6oBSr zltP1I8TVD_v0wW`66djd`4C!uZTML9dF&A4upL{+njLf6-dKCK_S z>@-LoZuEA-H1_2Oxs7TRb|M^wUE|ReFT^Ne0cVywX4jM!)DhU)HSmV{DeQmmv7Q+k zMf!8WYhFXYEV{Nt7Jwt@^YI%@2}xKbA`*PX{kVWJM?VRyL}fw`Seqf%1d0S3+2$Z1_^UQQyoSlhwZyAn(zeH(lU?A5o-IRR*$HK+!D2v-_gb;A|G1 z1iONe;t2t2P*(=X_70(2c30Yab>6Cfp}%&|0W$~ZMQk6pt-3VFe|Cz@!Ack9!m8(E zmiVDFaxw~pg2s8_ObI4hA+SqV5mLcG}U=}TOi(=b8llu1l3lP+-E-?y| zTs484*El?=l=>zn+d1EE;ZbzyI%Q(_J(SPZ4$-jNQGSXMH?SBPbXp7pZQ!$LAr8sG zlhyL+DM)PGVOD1?>GrT#PAfBhUR`N-ZN(kIrNupi9B zA*Eszs;6$EF)UaW!CMc>Br0ccx%QG81a*V0BIcT-+D<$hhLP;ZwmohWp|90g)^RU=%Q$utob6vRpvqnwtI2HFw)t!{ zN{)9mBs9+hPH@t$W&L7knzA|YS!!zP=kS)6t@k=|-Luu*;Aa!cE;gyZ;wjH~x~bj8 z!m|M-B_+P+CQ9nXnPRs})$qlu@QW_1T1j9{b_n%=nQK`qp(J31@3V3Wp9Ax_qRUqF zM)5o}QSf`EID{N~dZVmXL(a>qoje`8sBJH_EWq1r8L^-6?sz=PpPxVvV!LbfU%-it^aX)Y9Jln$@nO ztccax(3c#O9>?-js=Pb#6^U4MP?mwEX3?UCLQ6)r~TPI^(lJ)#E?dcK)2lMts5 zVCqL&(nB^5{rij2!g^0-Z#L@O*F$M!M+rTBZ_&-58Ym;h!9a8<`-l@RqTo4wd6BXj zS6Qa{x^$h*`ntQ=QwOJaM2_exVhhJdY_96N%;AZoS%H z%+EJ|GihvK_r85)S<=E_61qr*$M!vE{pr8fcq@6?mT1|o&)nZKgxdYvO!C8O41i7`(@Gbu!tA3r@89p4S;daW zR?^cmn03MG>nXL3SNTX*=j7tM)?RLhMEBiu&q8ij-DG-A=-V#wl>thl(`>({rMxN+ z3AnPt8q}WM{#eoKMLhd?2+IRA|8f5-e%>Js@@ag#v>JUj_t~pgoxrJmM-mv{m|NGe zgN^$ft;fLfmg(IZbi+%uR$c8`$#;9Ql6^w7PYshAvK!wIHM)cNVpMoI_hw~7o|_^=Md0Rz<7Ao1w`i6Zs&RP z>$m(3YHMo~oz4GVsLhsPc)9R$-0M!J-(^l!NWH8DgjoIj_;!p}GdrYxxg3AZRTG*B|MZ z0zxV9vkROHzfN!cIqIxqK-lX`0n@XVO>A&X&MzuD!11sz{z%oO;N`Wd;cvHqJ0)y| zr?GVGaOv+i`6VUZyaD^xt*`KmfZFh--(H_Q+uG8rar3t;R>`H4Z#>MRUGq2YirZ{t z+oHl0lOBrh3B~N{gY)PPT}S43kqGlC^qn4WpHfQd-(#JtOJpZ^{^@$=?Zc9jA2tB6bTA8|Z7=~gZ1VZA|ZkA!Ga z&#*Slycbci$^Od4i!+`+e*E}}7;p*NZ@A#bi|qjfH~_YYp?z!L-x*F)Wt`(%9sj!; zc?^mXZDxYwES;zq*EIbd#;$+Y8R$dWNppeYhtnt562+clt@Z1vorWxjQ z+)bKcoWkg>{$5va{t56<9$l+y1`_ZW72a;Pluw+|0^PTa+C*bkW1*+pubVau8BoJU zLG6$4m8Fmtv3;##-L#|F(1c3~y|o=Ex4}o_&eBFcU#XK%e3-QATMq!0;4Kkqgw66E z345PTV~rFmGaePAFeMnBb7PR4Z@-M%iOcR5e$CAtxWb$ECTIx!=y7d_xs`XZt;w<9ev8fC}kKwyW+ z$FP`G0Y_xG<5lg%r=WS>EEzHU#eTNLe2MeGhEp4BwZhTL56(YJD2Hg21Wd`c?<>Dl za7$pm5DFcj-7fH90_ZAg-SB0@hcG$N6HRbWfw3m2O`=Z^Y_2>U$Y7@+9)Q*r6gjss z_2JXC8>W1&8sAnT*i=iA-sHz#6Z4h?|i+#{Xkx*PsaK&RfN zQD_WIH%-EC-KK5Z!zwucUl;v?I2!bF3s|c{q082-UX?_nC|OYnY1!tmfI5tVb&3lA z`wCUlmw(QP!iv{we>pOXgzxA@yuKi2-T{GgG^E)9<>htg1#C8`XxqgXUpIZzg->R@9(df zBPM=Y(R!(e)l+pDem|pW_oyHOS*2#YV-46vbKAZHA*+!)MUzDX&-r9<9j;8`V89y( z#aFiJ(4m`uT}|1l+nKLpV+X`<3ng?vL7UvBL#aqxr+Vk4BA6UNfeN(1gE*I5JlnwF z@R>DFU*_q{YXb}A8w$%=hUCT1Do$$H4!cNN*yHL}`!2qO+bjd@ko@#- z9T67Rt4PjvUt{|bo1En?j%w%^vfJKPDkG|hDM}XhM!el^+O#>eUPrOisl5b9vFo17 z6t{PonX70vS8woq@Zdp4e9$;qAH_B`qS>+9ZNCy@78R-CRTLc7 zG{%}?)M&e~vNB*`ay7SC5(7+azrKA|b}>67mofI5EVcI!bl*oDE2@J^#;sjvc5dA) zd{Y}~+tqTM5bp+i-xHAmq2;pzu3Q-^`p!UAwU@8L9oU#MT>5p0irh+~gH!aJmKmyV z#`*=A&8*AKfpal=BOiqdU8|ptp5CrjfB5HfBG*RXbh2r}Z3@&Ewx#r}ikYSau;ddO z9$)_hEi<(I!JGz{ua$bd9D&dt%J*c)l-cXf_dhVM$Me)n0gZY=i!3;M!keaEpCKol zV62tVeI&(5=0zufP9P}}>R@mlr`XX{F*-yk53HEaZ!K|B-uofC4f*F&{kD8K{Z@W? zZLALXW}qW&{@?v0KxINHym5~nO-*6# zWmyD}odl2YzxgB_Z6(MXG^LKUm-G6!oYlx6Udj)K>d033}L*x*7+?-@gLJE{H7`gmI!uGnVS;(v}R z)dVk6PKGxE3OvVS$DXp{{CZ)>a3zEfb@j2}hiU9D&)s6zt_;QV(xLw(V}&L*snA-}}K_czI8)-!T_jPR(Ptilm!Jc%Fr|Q@v zh=T8Vei+pcPx{lWYdpnH$umDTi}w66h~j8GSVp!VAH~rN@tVtc7UVrW=rY2yKw!Mu zX;3U{I!8%hr*PQltD~KBJJPE6*ggk?TbDvBCn`FRD#%u9>4E$%biV0r(GKn?0ET&l zzBnPz&ntWUA9<&|D6naJ`@_72s%I%Y+jX#U=78-**%jbiPsJ>Z#BBrGv}BCD2j>IU zPJ^F6XFG2bAg+_sTGE_e6U1p0MQ1qkdu2hg6zkne>g$ec*G4EPDDc+Yggf;uxT-i;b5ftDLW!GO8g78=Da^63hsCN@fN}N>zDYZd zA`b`j713I>g^x(hlA#$_%Nct(9HvL*>oIQ(+0^0EOm6V36z?z;-O1qTmxW${_D|^7 zGkUcWkC(^Z4fmtqKkt_}J^UZi37T=C4elL(qf0X${`>z7`SGIT@BdYih;r>CEFbOi zI0hOglcyv2$5s&?vFOEcXZOO1qTUZ=`+f(!J|Xj~C{xjY$#vMYzwnSpyFF`Rx|=2Z4$vUuY$$h^mf52Ra}5BRSJhhIWUxe7$xI zF!9Yhp96-M?qDpWImc;k*p(}5wug8kNOr6F)Y{Iqq9A#L$%NIbSBqUs;DkWL!Y?53 z5B84G2v){4#u93pqLS<9B@-7PAIKNY4GRn$BX zEFb@NRP$X~^pR0Ps$*>4cO%+o7%Fn&O%HPIj}Y!aia*7!=mA$WZc&S8zu#5x*`0U_ z%t2m4EW-sdUPg`Hz2+YO%pCP>eDzBs>RCkRNs$%FY%E&Sb)&wJxgqYg$aoVu3lxbL zK!UF>z9#k}k)x*DyU@QNfU>3O)At<2&V{5Mnp1u> z&_5;etyt6YXrbKIoJ0()tLk5BYH|o`nk63d&rjLaGG|;Cyb`Ycnqw-}a6Y{>Y)>nF zT#71tsh^t#pNbm6Ct>jAPO3~nb8v&k=hc=6(3>-%!G8q2VeELrQbAKa5HnmG!p z3-q%43l^6w?dV3D6uS@E+5LpXEnS`dT7>B_i(*Ea z^*!WYzfAMN$b>jkOD6d)Dugu-I>;f8@^zaT`}}H|q(bdc0)^>~WyiNnXj$;)z$;Cq z(H%{gQHDCF`iS2BCu~-sh?qaD`XC}7$gK`g`*&=!`ar|G44Qkpvs~{;{ae4y4ObNz zLxCQ8e;y^CP&$&FB20y>q8W)y%#osJ^GtF^XT_c&1UsHufo4M|caAGnC9;aQofTpq zb((K3JdN0NhEd3iMZ{sg?+eU00W(ve%g!$d>QFUftkPe9b)~;+EfM4h-VU{8rOn7M z<->>IFY$44AJI^VmC3<4IJ~$rU|h{B_eSAtiFyBi{8F2W`d^zqM7i{2u+soq*Nn^t ze#5|Ls|46<@!4ue&UE3vV2Ss>UatJ+sSxG~R&*AmtuAny5EToxJ4ec6v8V7lp66t+ znAq@9%$O7-$K65d|lGTw|C-;rDxBtoz45r@WQ#5cpt z(mR+4Lky*dY2?=JyxkY@_WYWpPl^IzbbtSJ2|%ELe;Y|x7pfR_Ym>XM;=+wYL{#j{ zmmRw+FM5`$HdC)uZM#>y4wCIx`ii5tU|Z8fhVn*f>PXJhcliFKem6)2F1U!WX-O|F z`-_6W4+6?kF^+IBSg?h0MmW^F>F~@fL{f~Pv;9Ug>r8zEEs9b(a@#gL6x*=RbrGWW zoa+s=8SR1Sti5fR8#b5>i#hjXCDOa53;?5VPe>8x)U{w&q=RB(lpUp^rDcRuCPFmv zo=GBlVeXqjg~4kI>KrrIqA=0V{K~=*!e42C z<^)$Zt}enL;8~6wqwU$VXQzO@9dHXlAG6Gzy;=ln!5fY$St>}6gQJ$#8O)jUGF?jy z8_Q5{b|r>K#Ou8)WHKstkRLZI?d$u7v52?_XlonW*E>5o^$rf1 z_!55Zpj!^a@-AM>XWoN~og%@HK2e?jnl$Rak^LGqCX$_qW(>Vc*?im5qCMhmZvVtC zS(MyAK_UkD;dYsI&xAkn{pC&~OJL?He`_(^QNU;CiA)szZ&=fqKC{pI9Oj6dd1Ep` z)pALQ^G6}PP52n?;NZ}0bJ4q%clvhi+I1JsXZWy=GSv&&0hQ8su&aqC*0-t2f3|ML z=K9zKQ2<=n@})YG5BHTkr3g~`g1}s@&x|IHAz7IX4mzk}dlmv@&R*aL)$d1DICsHi z`8JLG`CuzTi#TJt!4w?LtA@275kKzuge|t-Ei@PQrxeUkmy(h?D6`i=2OPXdK3~}< zA%ecJ3js?Y{H^$rBaS37jBGRICyGH{XdE`rE!xvgG(SzvOv zqf3E{SZt5zp9iOi(UEC(g{)K=KL}VwBYi&kr{g3mD=Tq#hin*qBDb`3!xDMztv__f zl~RculsVz31K05)wX6`2tyYfofV!u%;e4MjUz(+8ZRN6#o|O8@J(*&34;E?8h$S4E@xB7H34;h5k;GgBYAhEpri zE$&dX%+XZO56eJw6)Y=^x@l@9U%m|HeR=S*tK7P>jP8Pq7^pn2R_m2xc}}|>9?kpf z-5`D14G~eBFteaTZ!LQz7HbP#zty@E`bq$z2U`i8=m*uxU@O-6FanR<8Y-7&R2N?H zBS&nOx6MWnf7iR8P{c7XYnZoL8b8@H4a18fal8 zx_%3uAPf8Y%zHl{J<~M!swxLxGuhNmeChr`4 z-F$*h?pCb%=md74Udz`E0Z2Li&mh(KC;w9Y_WefMxH&XLHllN%n)4Z{xv0wRY)+m< z?D+hY#@r=l)wOpBPfCb(badQx8;XD~+~`OXBeDUEAUuvCM4S7Y%f z7lBr*^7lMB{9l2wwd>x@}0X8OtOvTT!dMC{kU&XH(=gUiVxeeqX_pV z!!%{_nTezi47#)LO=f4c)M7ya!tH97V{8IP5c(q_RSfm-@b`T+{tD92qeoGcx8bP> zam@N{4raku1D1k=dHyIb@2Ue}8%M=qr8*BSsW#Y!AkSH?C~v1now%tk2sH0d zB#xeDBbsBpxCWPr&jcP7_j;Y+B0L*DN}Z+ z+`l!THmHBa!m@&t4Vl#Ow`S?2?jCntL@N(Y;SGG^B+i@RDB-$`%5g;+>h8fWZxaS& zkUwifL%NINH6uR<@ z!9d5ku2{PcA8jC$$|6Hx@m5&u)e37;bskc#j$-Sh-AQ_>k#)KdTQi-A~O%{$v0F`&+qMNzo!5hi&ImSW-fXB;IoBiX!qJ5?|n7RJJ5H~4#l~x15aJahNCHP6t^dI&T>BW$n(FD^xPt@De2Ag zUd@~Fp9t~py*4eJCy-Kp%;NhFn*N!Igas>AJ(u>tLb`0hjpD=0sO=IexJ9RR+_TMn z9>W!b3J7_iy2<_NMUeZ$hl>O>xHE6U5GDsEe-4tp^KGF=(Oa2_J5e4jK2jaXB+-Ws zJ<*8mJQgpv#PZt|hlR5-OR#~WG+U7_G#cNL=CrOT&B-aaXNAi0{gU(ZVq#+_tE6n} zLm?Rp-TIMiPs^E5a2e@51UkO;pW;I-*Elh16No zxndY}Y72S!Q^tKCQ^5J&*-NoY4|pu3e9FV2w!$rYcB#f#nL}BpGQmnDL^UW5PpPt} zl-i}#eIKZxh-9-{IPu!-z7K1^jpll7H}(|^w@SKo=)%l`H&q@li|rUhKG2{qr@3JG zZ%wR7k7CvOmZ3$7O;7I$G#fv?|F(*!KJ7oc2N~Z{QBjFI`$aOEgk_@@jMkGzPIYwF zDI&A>^%!|F#Cmt*LJ2!l_sp~p)~9c+l0Hh?l6ZdR##@cplnZbK^(J=8_M? zW%e9Q?)3Ad;VE&1OEP|CR&MG_&(u|XM~B{&CN-ar%#E{aaB`5+tBt)Ogbit9m6Y_< zv&ptl>$S!!NcWWOsc*I`I22SuoY`k(N9FwH=N~<6Y8-K5(%RRGcAE4|lrFvsb8Cky z{G56}s>QP%$DPVJezad9`Ev@aTc)$@s?8quHG|8%J@V8R-Qp|DpPe#neR0L*fHlT0 zo->;+A1u*^3-gVM;%P!%9lw${#oYxroT`jhi(j%Wv*cBFm4!(@Z?B*>onfmz>&*DY zOY$KaedU)^T3VF+tT+CvLMo+JW8lwC2YN-cy%LpSFIevlJ0Tg83k`X}pM3dNvO#E# z{!v{R>ozsrY2ZMQKRS31p0Hk(#RFa;qe-hF;hH&!Z&mLAcYR|H(?Ij`D^(U37q^h0 zB=`Ns7Tv{jCkHANYtJP1iJgpJH;A6TML_}pya!Ui9K&ho=`YlIPpDbeh021IiufIG zA~MxFZE|&uRN9E2(hFz>DMwE9$hJzLCLK{vhPhPVu>4g!vAj}hKaUBMps8(^zro+w zy$qjLnq~jz`46^82<8!7B6(Y!Iy@i8+@3yL-D`H5ZmFj1Pf>LBlaPsiElhD@na-z{B%- z&z6}M(K*&?e5i1#D(vsc#yawCd@BiQ1GCg`)O{A&B=fLVm5o0?mMGDL8eAT6@~*$a zS05jr_B{OQiShas)n{yP8tW9;D2Ii}dg&0WsU8JJ=3B}9OPm+kg%bP5B3#>hv+Mxv=# zkgRV0m$28D9n|lb0P6cX=n}K*du7B8vxnX++poXAd8FGJOMdD`*t#4LPHOXY>xR3` zzvahR0j1*krXjr%81#@%*Rd_%bf7@T=)6nUmy0Ah?;NK!4fzKynK_U?Sci>5+>p;} zy}T=4lx_cF#`Cwo?zFW)#?YS3hwCVDa)UU;9CjNhz_3T0z@_oe}b$e9MB=qJB?-8oJpNiH# zEfgns6krRaK95aJ9XmHjgSKn%H+_LfxOnKUbcV>(l4&ie-OQ_gVA3mzrOHlg`o^6Gl2n)jYj1 zf}O_qL*siZKaeD<@ME*mC$(BBx)7z<>g!#)EBv^gBO*&KRM%90c=BZ0=}sOZhseN* zT5Rwa%(8Mxn0!VK|Eua7)rogbdtCv!Lb2m_>@aF52TAAwO46AE)rtK@keF4dEE=Ja zK^)uDZUqw~;~Pr+%B@*Vb#P*F>ado#-^+M#xSLnhIq1;R!;izn2xmot)tnRR)A+TJ zt64^{rPr9yq8vMlZhOj`QRMz<-Ec8CKewz2jDGcoa(FONmGU+uCelb9y0+@wt5khpXhnH7Z z`>ziO%A36S(=0=3b=h-xOZ*TP{)Nf1z%e%fqou;fU|aHbO;Ut-=0(1v{H*2&SfU$ zP_V9zVzCpc!-gvyazp%sX1B6XX*h6RJ?rdM-KwrKTFEwIPKn_H=i?WOzlEIYI3sD< zhMd!Wmn#4HX)fgf-))q6kw7*wnI%tM%33}Ru#kiq)@18d?YpCK|9McRw zr9NdsfZGFMkEq&)umil~vSnrfmK<*%d5xEAUnldzJ)c^F(i3dHPnKJ;Y{!QB9}%&7 z4LuFNxBjHiw=cYs#Td;iXz8@}zaPA=Sut=K)BZ~z^gmv(65^c|Z^U1FYlZ2WDuUq?o+C+^8Cu8$A zNLAlLL+V8PGgbMH{d(5M7a+Z{46?5XS*5#q^!sHGzI-{k^82#C^2J7#>|S=uR@b;G z;=+U3S|&^Hq`!e(6Mg}t5Xfte9-W}2wO7@6tRqjbrDT7TyUG!-cDXz2nzFl>)~$>G zO(#0JAs-jXeImey%bZm6(X(Y;iJ(-pwG}uxMf{d%jkqBvJDlrz6!I6X=fELDWT?Y> zY??)!p`eEK&CZG}c|aD5s)1Otg|uo|Le%=J#ekdt^5!PKTN)M@=RoTTBj31jx@b7W9=ysMCaSS*|Cu1-MAs0+sLbM>Q>5jxNGLE#_^+H(Gdg{E#xl0tKZ%F-O zzGf`RIEPN2+$T7Hem0&3@dNqGA~LvLds~`9Oag-S2W#l!bB*$~C_73XZC2p2x##C8 z!X3HJ-{|JE9|lBt^>9W5+vq~VAM*9xL1!mE#XeJ_6u=y>o@8Yj+KPppboS+I)BL-0Q-1*Dc4=x#B6hg0to6`lnq64MTfIn0 zSvczi#0tlz)m$S0t5*tY7Si$ueipMykx{1ZQ6xV`s81{X();-!O4Hw<@RJ}W%isA- z|LwCv-g5%JFbqf`QvxexUevd?b3*83ZjT1sQz$fva!&p1(za&8biGN^Ytpu zwk2Pe7H2;Ynb1#yB`FKm2oNng)hR6K2kAy}jJ3zPww)L29E@X4L7)#RkquRKa^j2p zPW`I)Jo2wM|33utzuajv$fq}C^uOs^&A+r1L1F*(-~al<9fMDKG+$cwMU)d@$r6Mu zdQdJu$PC=8>O^9=Al3hne%W3~VCj;&vt;&odP)%uAY|-|$lu17ZY}^hx%ubGwc8Q1 zT2c92*ODfeB~hin$r)nnsG|x#g#Sfc(1EmYjP=;1-@U{C|8T|Lf`hC6o!q884@M0O z=IGvpjp4Wpy(PZj)p_QByd`hlo9fI2JFCEigSH~nnSubB%f1v5dGb_z;|o)^2bp*Y zyLRBp-_=HabvEYtt@yUbqs=evxif%iY4 ziUFj{Fpjay7fDq;d61tYphMx0U`r9>wJ<-~MPh_p%Xr<3-pjA|*t1xF_nocj$wX6R7xdi%dWzWdJ_Y$pgU5v*hv z3E&Vqo<5jWB}NFz9}t(_P8JG7dYsh!7H2m0=ppg=lZp`)@GzfrTlmrQO1t)t!a+{^ zoJS_wYAF)OgfwHyE|x>{ozo@aU4-}0-iL-_br=9YKe>5ipz={xxsZ-zCpWuC%c>P5 zBElE3L364hK_hg6@%rR*2ocb(>Ie}^;qKLpgU01-;s!Oolsjzq$NeZCyWao(+xO=I zHUH@Uqxbgz|C|5cy|>HAXl!?uFgp3|;vD$B^aftIFa2*ioY;ir3@Fq!lMSxlI9cY_reqZ_kW!W|1Vfy;xfIm`$L4$d;85+MQ8kUt8Ma6}@Ahgo#mc^4559SJ4yqLj4 zJ?6H-XXZhDPq9CNR8Pa2Hy_|>%-YuyBE3EuSYM{}`L9gIhnf=+J(0~K)o09F4-t*_ zk0T!Z=AoL@kegb6z1hF{yA-_OF#9uF^J`XhI|k1|7YI-btMu7})qT*MD`GANm!3kd z1u+Tp_`1|O`R(ToXH)>OS3fTHBq-)hxuA~qN{(zYf zLr?UhP-b&_xTRQ*9m_PzSxlRBuP1AXgPDt%YCB6e?Cu8pf2X_0bmdIjzb**48-Tg>0UrCg(3$Jtp9%+lD;poT} zJ&=hoKv55Gf2s}Fslitv%&a8)`X@{RZb++igqI4OtuF+=IeCFOn2m1G2%+m%|>)Y zsnrW#tblW<=lc|GuSLT{^lVgGHx&dh)36*!B&dWQ_k;z~mQE{ij`_&*_5ke&4@73bVXU4;nPt*K#)ppN6e zd|)iC?qM=+$8N;)chsO$7X7oRt#aQMe=l|InD9x_FDCB(xv4SjpT+Ib(mG$SQya=KMUf^X&|KhU3a-X0&D-KIAL>Wt zizt2fgC_0GL;N@uT*NBe5$qP$g>X9-(5MsnCO-?32PJG}E(A>dhMOe-nNL2R_WPgn zI;(1hTU!{h$$Skq4qu=iB2;RHk@!q_C0j`Jy%qN2xyv@6NI0B`1x0}%8O;EW4-n%A z?^P4gKw|8WUxK7rFqA(=jR%F@ERYd7Z^t_uwnVTqOi?=BWE;L1cDj8q#7>EX=)T1MpH#L7amz*C==r- zVq-WX=c+M5>`%xo7Yh}+j{x3ta8F_^EkKMIJ1iu*;<6a;1Wq%W0$zJ!vBmfLef#!x zxw3A<$8RE>*WbS zWL_OQ1`C{v7=E{i_%)4E9$^N~7-mu%`weTQT@=j}?!i4I8GNmobO5QA7(9hO=xWW+ zuPYz#?)|(v;MA%DV1QoQTbb!|74BDF++BVO^3o%tZY%UkZdIR%b;ko5j?1G>>=xn) zfscP-hIjdghwlAZke(QLP((g&I@J7+R<7&U=j>2@ZZ%R8G!I|+JssiK z-*xPiy-enyC5&A)r*1FLp^&wZW0}R9J;Sdr$-AL$5Q59La6;=B%Jx>*3pFl|##Y+n ziU5gmvYfsGp8SZ-t^C7k@T4&jlZasmtqr$11p;?Md#L>bZ2)ihW-psn1)DgK74E;t z&Yl#14`pF-wV>7C)44mtH z@Np=ZGUbSvB$1TGqA=%NlQFXonm5d{@HOsFh4hI?|6zQ4F6_0QVW47LBIW!hTb%JF z56bSRP#Y~I*ik^eC<3L0{B(VGWN(zb$BN58+?zcoex9v=H5feG!DQ`DBGVMKQJhup zn6WB;3A&XSoy1&@H)&MNFYOwL1GGauCmbR);T+p>h^VMyTQ^HJHZcP1P;n`-KQq5m zrW7$@t>-A?7^-K1kqerPabZtUaT*nEEBx|hml(oL@s<0lFh73}wL%}0J#1UTB`1QN z5%~-<@WdLfhQ?kLy3DWe4|`5NEm!gD*cr2@NL$2M=iK&}9+0ZXksFH^f$h9&z*@Cw z=jWMY#}qTA*`=Q3Exo=ZkY%YA9WXgFO=21K<<*%9Yc}?J=9U5HJA0lx zr^r6DZ|)$No}^&YtPp3NG{!Wu{jT12$0jh9B3L+zR)?%QJg}**Jm&4psOA$kdqSkY z?xL-wYw3Bs%0&W5Xg{a-rimhw=gLE(;0Y>=a}orbB|1`We@h8`g5)9_r^J<}J*_-q(dfS8b0o9!B@s4k+W-JX_q?I=I?I4p8 zNTgZOa)5!Bb?B?s`Sz=NT2K{gg7DtEvi!}s%gz_`t(?T&yuzf_(jn=e?`jL~6{G&NoSR2|Fd@F*H{@%6+X8G~ty?wmsH{nPGc8G5 zaOSf%@$p@g*q5GsgB(@2e)xUT`P+=~vU6U)K3Fp=E6aqrNWRZCm>F}+xcdG2muh1$ zU)g1IiWy|UY95@_dzII%e&3w3e7;tgYvh0U>&o<63i_SEhiwTT7bBHizH|OGxeXmy z>keaA;dheh4P1l_;1*WC=#eN%hiFQja6qx9}@lkCLNfPCn@} zZ6z5KnFLY4>Gr*)E(g;#m}PyLb8?Kq8<##35+@WpTIbAPIjYz$8R=wwzE0EOqZyf* zkC~+?`ROQ|ROqISK8gplI&FIO{Sm7FEV;f<^lL)E054M0f0Ss41{UY|t#5hZ{wr>F z+_~3W{9ZV-hbftLI6CZ>$XYaMvURym-@%_C?k%G}FXFhi+fQVV-^O;eD z^9+)jc@ySOx<5?4r96r{tZ950*;nBm7ddxh^dB{Ue3z+ZK(M za2D!SoQ<3lfN5wG;O2H9iS6*k7RL*X+eD3wUWoGm0uJJDM242n&BlOCe{7UIo~*5K z+UE(6;7tXrIx-omI!niFG;4LA z$|wEk8IGw1r_OY2-`o-)s_`Ej0L0(L(tzn1^2}j}$6Q1HC#58R7Nhir zqqB`h&CxJh%B|7O&G4&r?u1|1sx&p=CC||RyaJUn3`ZH*UuRG}VEa5lu}2QQxVLHN z)SG&)T)TdK`X#KOPn*)0ks6#({Gf@M*23x$Rc<#>h@r?F#sIMN9IN>~oJjGua7J_| zvr!wa^Zubije8I>YrZ5~WT!fGk3TIcntpxo}md*x4PO;O!rRj`!?U^p*q>QJs zlkVH@L%pirv!0liouR+ul$aX!O$nnckXSgn9{P5NF`DsSZfsluF$J=wVW5t;BD2PVVUb%l{uU;8pd}c1 z;qdy7jl9EIP}(ST@~ZGzU(R{)Bl+L4C0=nSYK^I$?rv^n|? zsK%pU545e%=tc+%CJO`!rg{>@ka#n%P-cF;kQANb22f@u+UF?o!1QzmgQk@u0b2wR z2C76ihaml`N)GQnZ&j~p%)r?ffWv0R#bn7GDZQ$cHza*GZJeRsGRw!P_>oCVt({~x z-QM@ug-tggwta%{R>u?<;&V55osg&QZ%QvjrRI1snrkL*Zf) zHUlMD0K^e5d?kFzF&a@7vF#nST@e3-bfmaVw~vF@y#)+1iqfn3oQ{R3cr<5~PrCVu zm1Jab$}8tjGhtJ(c{B+EfKjR=2S8K4Syjnv6gDgD{jOfsy3viBBl(8vNtp;!d?g8`m^2==pZw zD~caH`{j=u%x)|b9c?dXnJa4Uz1-4s*$c1?W)Po3lhC#e)iai22#HZ}G_RuFz6*uI zaf7wXCm+s{*5N{}_y0I}^eKV}<~A?y7Op>%lT`Z``T$p`$MCMc1NZ;APZUBL*T&#c8f&>;P@_ImCL6I-aw{Dz+!mAz5joJ63*f35)^!%Obj^L`-4)~5T$?!fsq_50KILuyMto?6HGiW`}%H&1q96(!Fjxbn^}o__vehSE-`ydH zCAAF@oIId3d3SEL_PArN&*)8?H>02E3KC`v^5~Bnf4?PkEp20@kR*FS7(dwG)j~a0 z44M>39h_(4!<6`UWFQN@h~5Lnfe+6w(Aa1CB-mkKUnYjWC;JK`quG#glVBA0W`W|L zk#Ot)0#;zMJVL|A)02{PRvtaaXONA$#$C-QcgxtI;NalD)qmiZlU)J=);toa>gYgE zMLm)W+?1u`^Iu_?<_SE1jyDB15aP0)L^VK!gA=Um7% z+xio#U5%FzP0R46TvS69iJB(Zt`C_hIcpmV1>UJ795xh?ZsJzk3K+T$^AR=4HbTa* zn)8|5aa0r_sX6SVdcqf|NYY&HX@JGdPi9eivmTQ|P4Fm=-_|C7_Xidp#F4V~`8Mk6 z>Nf=9)21yn?5#<<{$s^>bII-o0#a#b}uY>(&{pEW;Ad>x90fh}D8FD8_GiLPrupDk>_RYxX;rF54q; zMjP9Qp?4V_U!))Q41EeauRGjs{sXNEV>gc5GHG_?ERN6oeR2mjK6^gGb?YeE@mH>_ zo^aoH{N?NS(K)T-C+@DUzG=d}3xAwvEEp#lRNOHo`)++{isWyHhIepX8lB35?^Y=t zv2tw;P3(QbYfCq~g$gAxzo(B_6SM469$YF8JJ=>x)l}ER5iapZ$jQ3&aN%s|b9bx^ zJ@s*1Q6~a=5I>Jsk3M3B=GpyF6gjnF)}$@JBMwjXs+#Ypybq261Biu@`7W3de~7&b zGThx zcIw<$N-d6(v8eW&4!bEq8^i|C?!N1$MPgMK+IDPk^0D^LQbJM?MJ|Wf7CmXc2vRl; z1vibd+>?2yXQV&{_l`L{xAEB{H&Ylv#KQ}TX}Kja5&kU!)HYc%HGqx%(~XicaFKy? z4`$UL^6d+R-IrXB?w4r2D9uq$Q($a$D&$r;PFqAme>8^5<%fo4--Oq1D29FCEzMUN z({G*`e&n#Fh6#~npI#O<+;U6L2~Ic5O|5adiX%N5EkADrr{VKY=FC<~ zm^5^xU5Nc{3)-sbe2LrJIODa#8dYTB4&Og{>~afoUKr1R+dcQ~gWa3KTXALMGd~{x zXb@Clb@%q_4ISO(TFW5u+-Ei*w{m4U)1i0{|A%9iqC$hpAGb42VoHDSQ656eJ%f=} z-ZyJ>;gmC*GCut1koaqc6K|fX`(99v4?Mr)+-OHrP(vwDnD-y5Jrza0?p0E#WXlKfV$Sr_kN70aSPL^lrz6(%mS_3ORD z3q89^2hei&2=x9#!^Ebo9c6tc2>5$o)wCOK3e#uLZap3ZJ6#*3RGq!O`he41O4e{2 zWSaNym0GgI7Le=s@#FQ-@Yp$bhy298^c<%Qh2Az^3{Id&SW5}KHZuvuP#B4z+|mU} z-RA>l%P7xlrHw{EytPl@xmg}L@(3%1p75C@*;T9dz$>PbK>ft3z3>()QkglbuaC(U z8qB1DE2;yZ6PcxD!#+ML+1fTRm*G>?S0Bf?@{~XP%n6@mA7#@efMYy_BR*a7m221D zV1JBn+?WUGxOn$Fh`ML1d88?0*l^7I&v^y5^Rv>Vuc<3DOf*1Ggo7nYMzRH*wQ0zf z!GI%vhZ19GiH`!qF{-69E(n(yg$HR1{Hv*RS@yU4ueJ@;JC~`>RzC5d&W%4$YVqQS zz`mKKF>Y=RH@A0H+s2!g!@14k(yUVo@He9G@ki=h5SBsj?9GGSR(%MdCa)N}>QGhO z!|&H9$LDRogtf@f9ve9#?LOvQY6CEMBA3W(>j%Q=(KJ=zC?+_)g5V+!l5lGPb^YjV zxy@wW2de(ZOPzjz^8}bB4r19)zpCC3S%Q52B!=|6j%Y|lmx6MEi`c!*^gEVBx(*vJ zy!a{R;E?+UV45<@%0@`%mzr{tu)tgnL|NnxnKj8sj_!NMdnf@pZaCN2*#lIBnHEyY*^arun8l}hh<-G z8N*;a?Nt)}<(JYh1-cOWdb)mi%g;YC7~j@k5_k~5{``K#nG^r~wa0wF$-n;W zGiBI`VLl&Qv60ZA$})7oQDnnq@8Vgn_b`B=1-7V^2KL%Mlu*rLq91bFIDek{lj(Ej zJOavFF9+)g;gxX@%6nuJ+eUpz=9=xn3>Qfm6_sGD4*GIax0%7n+YhoR3c%6t)!Mud zn{l$w+Hxln5vyEA^i2)JaCv!^$lHp!uq(sY3#Dv>8akOJZ-{v<4k6l+z zY3}5bko8=-R5*csa>v$$B&E|pKik6%6JiD)mlYJ~;y2{?!$z&IuTMr^zQn>4#oa#S z*in&@ryloWN8(IyR^8_9J)~9MQ&Y|I_jk!l`F@B87(M-}!$6+61^O>|ROcAI#OD2! z3%--V@KO1)YGQ8q9G^{`4}*h}8v6bACl`DtSqqkbbwcqPUF*cEVlHs_y-?Wf1O**Wp2M{O;z)5^}YOQM! zq%I$vhk(I!y3zdIJCSYa$?_{#c3!bRy)j8%QL*QKwb^g^&5r9<1L#rdH9dS-Qew5} z&72agiubZdn_oJlKEn2LxTU9zNvW?8Q9LS_EMDC25e9<}YxtX*35*fIaWC$1=-~Eb z=cDmAO7s@sd~hN!C2M}Q>l6EBmn~3+IA^!7FkjR>jDAO2`OWH4(#3Obgk3as+#qL^ zv;)!hrX=)9u|Ni_Orbehjrtb|4iNrsV*V=o=UqcpMK;@IMqxnxAAN zWO4@DGuBwX6pPOve1C3=4X%sMhx~r*+-6iZYQ7|c5Iul6P?Gv~yb1U1A*jH!KfCS) z`pM$VbLvbKEnZCY1dC(khVE559}FEp%%QUD3m^S-h)cV5E<@+n?!9Wffxur*OLS0i zCklELkU6sVJB|+cSM{8waVfhnzofkH(qv@xQF|C)hSo3`UsT7;_ubJpJp7#@5{jrA zxVg{`XsTZTy_CE2$E3`CpUXK>+mW!-?abCoKa5p%vFCG$Z< z&zp=T_3P`)nP2-G|6lF59r!NM*V8fo!%!qGCAAes9Lz{G=oDBbPUoe-c?a{ka^>_f zG9C^M!40xsjHDmJyu&{*(1umyFB^lpy?h1zdLP-*i|9c>$wbF1hT`B|xWKub&nZF1 zxEh90ljg3|#ckg@IMdBN9(tB$jEj1WwC6sKmu4IX3SW9^aFSRV<0s`ex`+)X`wR|z z`{XOnZARE`5j~!#(=SYIVO$9Tux9uYIApO)5Yk5jFhzGHJpqq#`dc5l478>4IkmX7 zF8p**;|#M?_tbeGv2}nWBtiycivun2mdCjGQ4JWPQzX|2Ns;m>x(mmx3;ZUBzeCFM zSof^D+@9&1IkH^;vBAyw-k0%!28>?;1TH{BQ6|L%k1QG`RQbX1Gbc{O|#9TFzHaau^b zVycgg3|v*-@%t(6!y6a?c8Mj}(SnN8*i!|14#4Zqq*x*?WI1gdb2j}Cg;F?~#DhJ) z+t^!oI$pgON4ckzl+@iusJ*iay1zn3AQd{3!q*f1@*9F>(~uGF zJ}^)R18u3x1fTiCqo<%-2#8F+5yieUMq=WNz3$qMF}jcKcqt_-l@;S-b)n%2;@?b~ zd}%Y9eJbIICRc<#r5|p;V&Z1fxfnXYt;kN%I5f5F39^>Zs`Ghe!=MJ=M1Rpx)8SnTKIq$USuNI0wHAdmi^d{#FeJ z5e+*E8MR)8@fU)#hbXVZ{7hW@Hso94=e{7HO1TY3t$>*CP+M6eST5ZYeGP>|zGu8y zR<#~jl5VMtV~Dm^o;(R zH7FtU(O097^AVL+JL_a^70#2gsMJtfv*?`gE ze7HCVmVHX5r`wXpPnn{RMjx@cb00%cauoS9=X(!tA5KjS^a~u;bF$8jC^_M&xrm5w z!8bgDMgD_L7sew!-HYD6w}^(RlI}G1FsaFu z&)J3UG|M0;Cjwk1U&;kBb~~z$XO7|NXL<+=mLCXPbwr!Z`}^;|8(Iuf?Ri#J?MUHX z02&O8u}A7*<3OXG_||idc~iP=JcqXRyEfN&9{#gPMke-YJaIlVv0l`Cd(Vs!U(OwZ z;j{-Er(#E-0D8sVizQY?$s6EQYwfTn)xk7O5FHgY3l*KiKuJNt^4<^Cp=im;T|RNq zs#O)lKa_pvwYidYv)X_i-Wto^%&X5*tzekw9Lwf2Om5D+IXT?G@UH`B`jmn6aK)yB z8e!ec!8ME@H*Q4{lHtG1+*_hd>bXBth*8xngdoG0ZiT#d5uEq7+WWiu!Jn z`Us|nQdw67E1I|gD=bbx+L5S&*oq#km&`de`>payZOjYr(E_0TIFgMA1U4iYCg&%f8NP} zcyIVKf5&0K>Ic{^jcNh_=o7gP&}U~-^WE+jqv6BUv-@qj!zX2>7SJgWg(_qXb{4T3 zOWop--8{q*X4DE^b2F~Xl<*kKbZ7Bzfb+DBrexHzL1ELx64s@u%o811y*5yl^~2|= zc6bWZMmHsq8w=nhrFaJ!0#aHnEG+qX*KIZZ&!+tm%v-2I^*;(<7XYB3$&RAP!anP& z=AwvtjjJinLB|b>nYy-(#h8cj5X@;aw3Dnx3dlHbB(3qGEY2ly_kx5DR8CreLsIcB zJlc%-!Ha&tbTH}7bx4B{YWJh~hjf??y-+O9iu9hU3o4&QA^N@3--ja@S0-@_X9-s- zSGtTmS*i$pu@&x=QSCTQ-kP4QZ9JZFw$!&>Iq)0aL7B^(OSuQfUB=p5^%V9sWddB= zN&!2)X|_f=gbB6PN>~#vpWp3f4ivcXT{%rlb3WZzFE)GjLjbA-tju0zb|7$TG1pf$qr zvKQGPLy*(}9-VycXtsczQ9Pg1pfv0Trenx8Gc7#WsftJ5|kt#ZHzDwSk2#A?JLR{{0*J(z){sqQF{U+%Sl zy9w2VJXNi_P~TNH6yEX=39*kgMxhu*8BOYUoYF6*9i2RG-0L~VGCy?BbY`m-suoZ; zmv8>(z>m@3Wt#*@JKR)HvIk)1lZ`md2A15U{Ol;XJs64im|QWpq=`Jlw+?L1gEqKN%HK7KZVoA_DuIU zx$EE_D0wv6pY;;9=MfSb>M*Xky3G|gRwS39w$o8<8+VKtq-TCqL!>9SaRlr=5DHkH zPnE1igqgk0G2B?81I#3yIiuX=ca+mjxrzfOfLp?bTBM0i>*h8&9m_fFm;!Z)R^Po# z;(9n24P7U(_+92UHV-YgWThslA(LaNyQ0$CixO3%96BvA%>ArH2__AMP7czf%~Mpn z{CH}YCe4Y)Axggb={;OZUo81!MDLzqVomAUAD~DN-3@;2wmM}kD9b0e0aQyunxat- z(T8R1gh`Xum;=$`>45>V?Hic!Ilpn}NACt(%P!^|$AQek|qtt5+ zq)qBlMv2uPSXxM>k2xMP;u-zZH6KhKNW_Vs1m?(u$AwFD-isGa%AI|i*rPN!tq&go zidXi;aAya%8kAwy8qSG8G_o{C+>Ar(5AMso6eE{axpcPtL+iX{_f&+lY)Ql6A2IB~tju&WURXDnIp9V82sZLA>?vj#73v4t^w5u& zzqa~RIz%>YY}$V3@tIv3^nJYz(5G;1(s4~H|fU(re{tT&oXxOlJ`EfUnET>Slx%$^r3&zdm%!qu5@i?LIx z1PxjA!Lb>d&8C42wF7QML1dHU7&K+h0YjfD-FcBYpoB3 zvb+FTjy@PfBbY^$Irk#pvW88a)g0*DO3Z(6a16Qj<}D#{Im!is2i~G(p`b59dpE z@KoX70Vv(xpw<`GYI86BmR(-3j+?H1LP`Z@SHMA#>BK`1UsuE~E8iC&|h6@~Lbj&`mE+p>5NV9j%R0%$i(f9Eh}=30^EcdDd9a6(UbAK&^9_bM;&0;xP1hvB4;Kj2 zi`)WMLe*c?i5~sb`R3S+2j%NM_ak@T~^b>Pm?OIzKi2)Hv zhBVNbNMwoBQ}-uu3Dwd1;s(j(?Bxg4?{y7eqams-Vf^wpKkQMF)wxHVXjnC55)>hn}#(l6m*WyPf&=FZc z;i#7J6d|fR4~-lhU33L)2X`X)fb!`=n)m>-S&##<%04-|;!{^iT|1#Rsti2DH^vwd zs0MJ;(b8K1*}=Dk3a#H?C0J^$^8B;Jssj1mgf-2^e%PqdNGbvw0njumd5%$tx4rkk zDB+Vf2 z9p`ta&`}hb(`u%kVdzGtH`O{Ik$7TX1Wi>k0Mx`9!X2b{pS|TV%4`Bn*aVb~n_XLb z;`g6*c-qHNuSPMhBp}BVz#L|I5$f9`PaMi%Y-s&s^%sPbrjh2)xSMvr&GGiG_3W)> zmg+DBGDp_`ItiU3M_h2ry=igX3q?kUvk2tX{p?pQ!i?y9{!ie3;Dn-&1GM;`0lblP zWslG&0S3;{DjjY{4^1-^34*6N*{Fr@Nczhg?+1Squ}Adt1*7PE+K=L)7fyQzlRttzR(a z7=kg4vG`Y+U%GhlA()h;kd)j@AZ?5E9O^Qaem+Qbaon`}lLlaEaKcZl!GYx~0OYb% zR<_8(6i2pyXlQ$)8aylU8^i@8MvQ3W^J9S7`gTJ(u=nmtOK?6PpVVPhLzZ0DJ@fnb z@5?lJ&bG$;_g7Bm^<1?#Mqj4_r)|dRYiKERD1w~8T4t?n<+Ulli*CO2>A#y-D7+mgll~}DZ*9l&?8~#SR*bZ6kLP+v-q2J7^#3&70AQG&nafzvQ z?piPuhvU&XmCEf~w_4*Qx2Z{c!tI58E)pGp&BB>DtoOdRFVo_|5_q5bZO|`uA+FeX z_5}UxvvEwZsZ&3!@srU2?^zD0GPAPYm1l4CIrI;~O_?0P`z6}y$ z)N5iRuG*a5I5#5q!z-Xz!kUv{3Ortk9?W~usyG`Teoq$lC_+ivF3lFXg$p+!?0z*2 zLxdK30w#%sAM&ZVW3TUDz`e94gRJjK7qY3OcfXKlB^>T5WlHh1hHZ& zdH_(dm=Z0Kf<)MCFK@!fnHA;b=$UbMu0n@g7m)p+M(i7K8Ja(l)yb2a&dp{FnFC#| zcV?(~{t8$Q-@gDZ6+{O)tSlm;2%-@7{K(8YrWi|5&M+4Fww3&P=bKf_hI#=}0b3Qcp{h{r=iOpIm1 zYY;L2kZqe8ri}2kaT6!*1)?gYfhf7g+i5$#S49gEdqDfpq1`{%`PI2C>Idr_8w?^O zu$sUcGXUg>tp^Dw`giaf{{y)H|1A_nAbUVjroqH$g#|$+`#)Fv0V>8364Z#aR(ARF zFIU!i1LX(Pzov+wJ8ZIL0!8ye{v5h8pN}_006n0QQKLr5Ku`mL0cCPmE!P8#K9WKj z8!)Z1e|d(1CI;lj1(ZRikFzcwtdx?JYzEp`u}4Rhh}@&dMlaO$U<1D^??K&b*28U! zQmGd`f%oNy2wOdZmBw;H+`{LBL9~{^W}f~o8^$09iPT|s<;^f}h7zR`>JbGEOoYt@ zzF@%~cs^m7m^<%|ys?$cc5Jl&{ewZAz0muyb_5gSsPqtF_Q6_-Mx$as6$(?(*PDF% zSXOtXNvg)qoo^sG?*@ox^Y`Vc;#?)LS+lnEzB!`Bl6&$7x0a+kQ2fEs;Kn_a-+7Dk z3bAPSVpIx!8dT{|u65;z{d{-~u}PF`eoh-L3B`sSWTs@amr(~fI&}jR6zitlVl43gKAj2rDvj6 zfx_WJ^+^ba_u=G^nzywUQK0LkY`lTEZVigIPN6X4@ITixkB$Xd6nC_54IQeJVo@6F zAMNm_3qvYCd&QyiNEhW?AT`#<2JB1>4=-gwi3KKR?=YwH*#x=Vtp3(B|njVENhH(GNG z6=BTJ6eyO)Zj_7#+GFL=gYa7L!Epx@;_ZV9@o1BVs%MIG5VB(9p4WiJHTXgna@br} zn|sgaSTHkX33fOpSZ%;Bii1BW<)iwvj<;VvF*m^%+|xd|?-rOIAs&Ocd7Nfu<^T2O zy;se5%bm1#2NM7crK+j@gV!FrYU{x3<{p~w!vw%o_d+?JB&VgJu^ad+zAz(Pe$>d| zp_^1g7dOHHjPv!y94QS{mqyth>FJ(eM38gHT*|$Na=IC_+E=CG4PMFaYnp=qVA$gV zT(@Wi4X6f+V&#c_ASNc(kUS5iG=NS}MW=6OmLf{r!!2m&L5OSS*}YH86E#hz|0k84 zf0mHEXbDl5r8%lKw6|+s=&7R`Z&}XZeOObF{Dj3B+$o+8vwJPCZiM|t&UIU_6Z%Rr z4$%C{wHRY9i$US1!P3~~T(?$L)f7_vaH<^?FuRcrfhlt1$4FTWQ(%g|#(e$U$si3% z^@dVr#McaM&ERe75-_~p z1c?{+7BdowgF(u1@m)V)g(kaT!80c{fbJeCx!p5HDcuVHV=E4!oW5!|$(-9cgUxv@ zAAW}PFA(+k9Ljas+mkcP&jg7;6fWSQt*+t{o%Chw^b!Kxd|Nhp>{^VW0(x4tsJ?2d zm!pg=@`6dQo#B!tLvFy(E>50j6AQGn*UA2pa2Z(%*pB{ul>^MWLa$Uu^WFrdpYb#N z=mI*{BBV!24)x{?8NTcr_gI-<#Kr^VJvgS1l!YoN!ybPNp3C1SwSDS8IHv6qYo+eq zesq@eQ_Q&*1K`ahHHN--c*`sCB;1?tnQXs$&6{gGPtIVWyC(t*C7G0-LbGP&+U$_0M#wxJ|(BLge`?}03 z{^`u_N@H>7%#0f|;e$YMaLwZS;-aG`xLvFJX5|eXbNVi|#cT17tbZei_)iFH_p_m< z^VivD-VV;aDoFXs8bij5;(GWig!BJ^^4i@vrrj+S+mXCF6d}ahkBjcWFz+(8fyYw% z{dlM`U`3m%Cv#7%gJ#3{Nm`GI@A?fg7Ze))SxA@Y9Ude&-U<8QN3unFz|)6<6t}x} z6@A0bNSXdiC81zLjcLQ_lV;Z>`kjTc1X|jfG*8u7hE&t*4n(;5ue$q8Cu;Q z{1FC(k~+_N?>}9$!SjE=!wdIsOVldO53aX3uB~H{$`e(PsT!J^3AgzrK{2QmN$7`} z05PEMrQFJV9cEsnh^18vOg{>H>1l!;IvA9Z`SJ$pLE)MC+M}~!{MZ7|x>j79tb#(R z+)z-Cbb&7k>u?xaDdqegY4&gYoI(}JS>b~NKU2>^Sy6yXeQIO2#CNB*c1nW?`R`0J zMMWdu2nyx_u)K$`97on1gTBL} zPDt(T{bL7hYWQemsU+V^i(Y34>cSn`1`71E&&n2c6 z73*TmzDlLO<`Jh!B-67_{5NP(o~bZ`pLq=EvDxXiHCnY0tv3SgE^^4~-k;k0nU@+5 zrZQF~Rh2S=>}j15=FR^c9CYJb&33=^&BnPpLG2Ij0VlIP&sPJ(qhSCgR?d%r3!}`A zN&-Y%)QJQrDBkqkQ0XoIo|cMyy*syWH?Xz=e^F-j65$Ol(=Xo3`N!5XfQ3=KzLSbHe^dwco+xd1w$c4WgQ$CBK=hgRaQpH?k1_tKW7J` z1UJTR!~52k8^L5hYxuab%4(xy$to|Y$aU$=vbCav_|78Qu&enR+oC?M4@^(fPBHuq z$+H#xS`zOl4E#r)Su|Ct{LJ&r4+T$H9bWH%v0}R50aiz*P#cQch2>UmD;DNR{yWa=1${JN#>z`MC31?Q0k$2$Xt{> zL3DBW&;LMeGd6qzLrfoPDNyH$#Z-vz&2Y6RMNuv&tm$a7)c`{F7}C#ezbf(x^ep0F ztx1fCl^Z7D=4Z79BG4rx2BqB6_Biu`-c7SrZ;WJ@Qc``uZt@@llyiX9FaZBn_}i$B`+{ z)!MadAK1fu4urC@s;ad|JfZZ%Z&0ZmGkWw(xFRF55EmfljfFclv_yFpSvfg5Py&Pr zR`d@Hn2Sm|7<&8^)S&`2JwatOFoIeZa;S1rx6G1QEPB=rXTlE799_#0E1v|fD-BNh zv5W~VplB2y0GDK0vd?HjC!HO-?)ZH;o!>+G>|V=9pWQtK5BE5Lnw3B*<<1x%L59v+ zy7vL9{LyZYeXm?8$9jDW;55F2{0Put_?o{0PC2npd7*bi)#VfWoOdbmrW{Ze$(#o% z=AT!v4W4X5P%cMbt?;2^rH zl%0Vw%fO2o3DRl-lHW*7@eHs;u*ajY!8eeaCm+UH7Ygg^>yLN>(nxaru*tU@Td)E| zZyYp1r&OE9NOWTlXFW)n@%IYo z9;|U>G?ANjGc>Pji?DByK>8Qc=?e8q@t8G?A34b4Q5>J@H-WnL%T|+`{txf~ss#Rb zm<2P*2ardZPW9aW6CfkR20c5>(hVnQUP#DrpP~3+B8i>b7E;TW0{@h21mYl)@sV&u zxf&?fuYE!KT?hh^KKE5yCCbRjT}!EO{YD**MTa90dLw^9be9+$hWhc}XU=?pkgvsr zj>_go!wr1zDOPZ>T~Em0f8YPP&S(4+#I|i9$>L9ev9v3el<414Pm{jz*Ps6jZumbF z{-xQ$c&B{a&{-5^<>Tn{eTv58Fq4K;)A|@d*|u<@#$^XWbGt|KI}*fwNbu1rvgwEz z6L=m`;Gk^&jeh*8Wp3I0kHf|4L>pG$Bm9<^Gz{pv%K_??bYcb$sq)NUd#;3K zTKDIw3OS@BeBya6L%GYbz-&qjqVvT3g ziphre@86e$qQM5vD$^^bAPwk;Fyt)`dDKK^z{*JGdezbx(%+*pXuVrrKX9tA@s3E5 zNQ67qnidmt^XMmhH=a0xZR-_UXA3!{*|}yV8mf+ZztEnHdd)n(ZpB+DYMU_%sk=f7 z*8;kDxkmiC^PmWZPm^1|5W2<$5Z&EqdPH-24@dj(;f7Id>k+xYJaD0~07WH5QU8-W zl!tKS(T5Tom1SqVuQ;6V;tG&nq_O2kz+(UPMq-`g)0GdiaX3N1RLnh2u7UmF8%vxJnyD;K9E7x$I#jKcmM+yq z%Bv6hU;NbjVGwI-I8A9jJxxL)9%Pp>3olF)Z8L9BTCr(dsEPRRzehlQw?jE>f78wF z;;(@oWwx(hx^!th|8G#gU{PTTM?rCKmb;6;oZ(7t8@S=eD5_#nN`q)~<7}sXAJ|Rp zgGsk*My+0la=*vWkMABwMUh2ef=HZ+0dUor2aS7x)NyBMkN@4fv4GJw;_%pqixT_o zw*yTN(AKvf`M-SnLsCT{=|v)`NvYXh2tI&gY=kS)Yw$89-9LT|99w068oQ#_X{$Gc zz^s1wH6%J9p0zypkVVu5VkTQa=d4xoP_A}yu ze@wRW|B2wwz6x(!x=zVApCj=l$PX?Zz07PdRVNJ9F`4}BoA8Yz0G-A{l&B1S1+O3I8{w8<&>~P0p*vA$ZM{dLTYN*L)6IrI z4C+&lNk|yc=KK``Ws%#4^dXb11RBA5Gn4j^FdGL^3@OBHJ#je=$f}TCpb|TZ>CO%U zc#}3GcD+G)3*U)_)Vi^LJ#TKUT%o-5z_T$D2CeAaZ0zvVTx$`kLLCh`bQ~~1bb_Fc^BVlRolN|j63~@| zO=>1C;f`ssEp?|m-r`l2s5Hy&fBYrQ?8Y32v}gPkr2#886Ry=2BuxGSMV)b_1o}9T z(!Kx6VV3ekdz)~+h;(Em|Hr{@!2%*^X_x~u#3liR?9wY&>Ose=i_;5zd6pVd6-bK0 zI@;t=%pI8>0n4>{DyLq_&AE6F4oA&^Cp*(<5@SO#{?V3piw((ii0*O{Vk1XJOoTv5^J1N50NCcwDa_kY*-snl>;)CQ}+)8}CU_n&m25|)F`bx-ja4_D7J(Y9=I7;EjCa4LDU6SiEQRJCgQN>K+zmC?)NBR#8W&@TNdPd2o+Y*Nd*}2j+g7vDK&h(L(g;Q6xl&Lp~9W7*_Gv7%*q!8FgGp z$+!(u<|!Yp(kYD}W3runvZZ`0H9iPkmb)#}5+_vE%|#Z`DI*Xb!v+-zI4Rx28{>xhQ{e3Y8ckd52%}NolsL3#LaX2irUCnq|c6mjlP$b5}!MfIt&ge zDVRq*Kx}DLann@#r2H%dM_#wbapH_B2+OjPiy=lV?2`g17_Md_Y|lojDEXMOx>U^80U$28nO zT$te@o|F6GuaS0Go_Cp&kQYo_2Pn(x%Q~D(arI6U-a)#V`zi7H7INGQ=u3eq=#1q$W=`b?M%GP&1OB4CRfwNg{stk<6dEC1dH zuOyf@IB37Jo_SGf(k`U)&h{CJK#GfwI_dP4^nR|g$aeKSN>(04TN2PFskTJXWtZtk z<+C*3CH1!IuCali4vCM{&_fuQK4V4<5P`I}Q1lk;Jl)_vkMv#cz}=ECSXIb5;d!|s zkX>*K>)E(84}d_3U^6-;>3N9Yj3_AZw7w{TLD4t&bO}u_3yqKfmGltJP_5W(SFT@A-dXOBJzdnVl-?qI>EfiNqm-@_ zs$!k(I?wt$uvG(bITh&Ln*_)hse6&twT3c6_g$n0U3u>a9;WAwl`!&r5*1v3^P3X4 z0`7^3z3&zK*B^Oag)BI=_b#9-inFNp1n4U1hwT9o%+4X$5dE2TDt#y*=&W1?r>Qr?;|{g7vgp+tbQiz)^avDCd_DN8kJ;%E7?o+DwN z(dfmE-#DbB*7vvV(%+6`cSdA16}UpiZ*+$z-R!H@zk^74c<7dSTYnoc-d3koS-8XW zTsm~2z;-S;Ko*R2)Ec(?ti6laEyp2%i9){vWTzxrb4dSe+BjE#GT(f7gX3iO5-BO_ z?k31g#JQ z9xuuW`-BMHlsjF=nQ{*lZ5X&!yW`NRfP;&P`p=<@# zl^7Xuld9r6J@S)Cc5O34-!f@pfp(;*j07`MjwHdJ&OW5r1wTvM_nikB(yN&h9Wu_g zT!N0Oq{dg$0vV-ST@OAg#STo?4qpK*1m-9Pl_aoJbEpq6#S~37JY~EMMFEoDw*5nY z|E|-}@(t;7?F~2sR6NG%&f);#a5m<0(6$rb;Y^1<2cKc#t@6FAq6wX>*9w#4U)-2y z%MJ?+Y;~?hhB5H@D&Qo8N(tmmJZ0>$qV522zfUZS{_t&M9Ueq4%f*8;w;353g|h!V z66*E>7HXaDHEixBXNe{&kU1=S(=zK)b5za;XI{j>+K(>t_#2Ku_ngj_m^aU!Jw!E6 zYn_L1m)e(M*=55>vGmkZ)LbdW9k*1qab53=H5)j>qYg*V?)(M^Ooy{MM0I!vu3D2m z$>^s#Yl?AiRzOk68n@813Q8C5)NZ1NRoC4b3t zbJA)V92roj(*0%+IU3Xqe}ZQLHqwSpBC`ksc1x`%0D7^)}1BOUCGo)Nd+qT-{ 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 - - ```sql - set @@tidb_disable_txn_auto_retry = off; - set @@tidb_retry_limit = 10; - ``` - -2. Global 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@global.tidb_disable_txn_auto_retry = off; - set @@global.tidb_retry_limit = 10; - ``` - -### 重试的局限性 - -基于重试机制的原理,可将重试过程概括为以下三个步骤: - -1. 重新获取 `start_ts`。 - -2. 重新执行包含写操作的 SQL 语句。 - -3. 两阶段提交。 - -根据第二步,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。这会引发以下问题: - -1. `start_ts` 发生了变更。当前事务中,读到数据的时间与事务真正开始的时间发生了变化。同理,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。 - -2. 当前事务中,如果存在依赖查询结果来更新的语句,结果将变得不可控。 - -以下实例来具体说明了重试的局限性。开启自动重试后,当同时更新同一行数据时,Session A 和 Session B 在不同时间点的执行结果如下: - -![自动重试流程](/media/best-practices/optimistic-transaction-table2.png) - -该实例的执行逻辑分析如下: - -![自动重试逻辑](/media/best-practices/optimistic-transaction-case2.png) - -1. 如图,Session B 在 `t2` 时开始事务 2,`t5` 时提交成功。Session A 的事务 1 在事务 2 之前开始,在事务 2 提交完成后提交。 - -2. 事务 1、事务 2 同时更新同一行数据。 - -3. Session A 提交事务 1 时发现冲突,TiDB 内部重试事务 1。 - 1. 重新取得新的 `start_ts` 为 `t8’`。 - 2. 重新执行更新语句 `update tidb set name='pd' where id =1 and status=1`。 - 1. 发现当前版本 `t8’` 下并不存在符合条件的语句,不需要更新。 - 2. 没有数据更新,返回上层成功。 - -4. TiDB 认为事务 1 重试成功,返回客户端成功。 - -5. Session A 认为事务执行成功。如果在不存在其他更新,此时查询结果会发现数据与预想的不一致。 - -由上述分析可知,对于重试事务,当事务中更新语句需要依赖查询结果时,会重新取版本号作为 `start_ts`,所以无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 - -因此,如果存在依赖查询结果来更新 SQL 语句的事务,建议不要打开 TiDB 乐观锁的重试机制。 - -### 冲突预检 - -由上文可以知道,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 - -作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: - -* TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 -* TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 - -其中 TiDB 层的冲突检测可以选择关闭,具体配置项如下: - -```toml -# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 -[txn-local-latches] -# 是否开启内存锁,默认为关闭。 -enabled = false -# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 -# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), -# 设置过小会导致变慢,性能下降。(默认为 2048000) -capacity = 2048000 -``` - -配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: - -* `capacity` 值越小,占用内存小,误判概率越大。 -* `capacity` 值越大,占用内存大,误判概率越小。 - -实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 - -相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: - -```toml -# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 -# 每个 Key hash 到不同的 slot。(默认为 2048000) -scheduler-concurrency = 2048000 -``` - -此外,TiKV 支持监控等待 latch 的时间: - -![Scheduler latch wait duration](/media/best-practices/optimistic-transaction-metric.png) - -当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 diff --git a/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md b/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md index 11bb30384a71..eaccd0a77121 100644 --- a/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md @@ -283,7 +283,7 @@ set @@global.tidb_distsql_scan_concurrency = 10 默认值:10 -这个变量用来设置最多可重试次数,即在一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。 +这个变量用来设置最大重试次数。一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,会根据该变量的设置进行重试。注意当 `tidb_retry_limit = 0` 时,也会禁用自动重试。 ### tidb_disable_txn_auto_retry @@ -297,7 +297,7 @@ set @@global.tidb_distsql_scan_concurrency = 10 这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 `tidb_retry_limit` 的值来决定最大重试次数。 -是否需要禁用自动重试,请参考[事务自动重试及带来的异常](/v2.1/reference/transactions/transaction-isolation.md#事务自动重试及带来的异常)。 +是否需要禁用自动重试,请参考[重试的局限性](/v2.1/reference/transactions/transaction-optimistic.md#重试的局限性)。 ### tidb_backoff_weight diff --git a/v2.1/reference/mysql-compatibility.md b/v2.1/reference/mysql-compatibility.md index 1c22ce9a56c0..1c3167efbe86 100644 --- a/v2.1/reference/mysql-compatibility.md +++ b/v2.1/reference/mysql-compatibility.md @@ -13,7 +13,7 @@ TiDB 支持 MySQL 传输协议及其绝大多数的语法。这意味着您现 > **注意:** > -> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v2.1/reference/security/compatibility.md)及[事务模型](/v2.1/reference/transactions/transaction-model.md)的兼容信息请查看各自具体页面。 +> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v2.1/reference/security/compatibility.md)的兼容信息请查看各自具体页面。 ## 不支持的特性 diff --git a/v2.1/reference/sql/statements/load-data.md b/v2.1/reference/sql/statements/load-data.md index 4a7f3452540d..65c848c85537 100644 --- a/v2.1/reference/sql/statements/load-data.md +++ b/v2.1/reference/sql/statements/load-data.md @@ -48,4 +48,4 @@ Records: 815264 Deleted: 0 Skipped: 0 Warnings: 0 ## 另请参阅 * [INSERT](/v2.1/reference/sql/statements/insert.md) -* [Transaction Model](/v2.1/reference/transactions/transaction-model.md) +* [乐观事务模型](/v2.1/reference/transactions/transaction-optimistic.md) diff --git a/v2.1/reference/sql/statements/select.md b/v2.1/reference/sql/statements/select.md index a8041459fb19..6ad448008338 100644 --- a/v2.1/reference/sql/statements/select.md +++ b/v2.1/reference/sql/statements/select.md @@ -74,7 +74,7 @@ category: reference |`HAVING where_condition` | Having 子句与 Where 子句作用类似,Having 子句可以让过滤 GroupBy 后的各种数据,Where 子句用于在聚合前过滤记录。| |`ORDER BY` | OrderBy 子句用于指定结果排序顺序,可以按照列、表达式或者是 `select_expr` 列表中某个位置的字段进行排序。| |`LIMIT` | Limit 子句用于限制结果条数。Limit 接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是 0),第二个参数指定返回数据的最大条目数。| -|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。TiDB 使用[乐观事务模型](/v2.1/reference/transactions/transaction-model.md#事务模型)在语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 UPDATE、DELETE 和 SELECT FOR UPDATE。在事务的提交阶段 SELECT FOR UPDATE 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 SELECT FOR UPDATE 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。| +|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。使用[乐观事务模型](/v2.1/reference/transactions/transaction-optimistic.md)时,语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 `UPDATE`、`DELETE` 和 `SELECT FOR UPDATE`。在事务的提交阶段 `SELECT FOR UPDATE` 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 `SELECT FOR UPDATE` 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。 | |`LOCK IN SHARE MODE` | TiDB 出于兼容性解析这个语法,但是不做任何处理| ## 示例 diff --git a/v2.1/reference/transactions/overview.md b/v2.1/reference/transactions/overview.md index be42c7e901e5..5be9dcddf356 100644 --- a/v2.1/reference/transactions/overview.md +++ b/v2.1/reference/transactions/overview.md @@ -1,15 +1,16 @@ --- title: TiDB 事务概览 +summary: 了解 TiDB 中的事务。 category: reference --- # TiDB 事务概览 -TiDB 支持完整的分布式事务。本文主要介绍涉及到事务的语句、显式/隐式事务以及事务的隔离级别和惰性检查。 +TiDB 支持完整的分布式事务,使用[乐观事务模型](/v2.1/reference/transactions/transaction-optimistic.md)。本文主要介绍涉及到事务的语句、显式/隐式事务、事务的隔离级别和惰性检查,以及事务大小的限制。 -常用的变量包括 `autocommit`、[`tidb_disable_txn_auto_retry`](/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 +常用的变量包括 [`autocommit`](#自动提交)、[`tidb_disable_txn_auto_retry`](/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v2.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 -## 事务常用语句 +## 常用事务语句 ### `BEGIN` 和 `START TRANSACTION` @@ -69,13 +70,11 @@ ROLLBACK; SET autocommit = {0 | 1} ``` -当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态。设置 `autocommit = 0` 时将更改当前 Session 为非自动提交状态。 - -自动提交状态下,每条语句运行后,TiDB 会自动将修改提交到数据库中。非自动提交状态下,通过执行 `COMMIT` 语句来手动提交事务。 +当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态,即每条语句运行后,TiDB 会自动将修改提交到数据库中。设置 `autocommit = 0` 时更改当前 Session 更改为非自动提交状态,通过执行 `COMMIT` 语句来手动提交事务。 > **注意:** > -> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句的时候,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 +> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句时,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 另外,`autocommit` 也是一个系统变量,你可以通过变量赋值语句修改当前 Session 或 Global 的值。 @@ -93,7 +92,7 @@ SET @@GLOBAL.autocommit = {0 | 1}; ## 显式事务和隐式事务 -TiDB 可以显式地使用事务 (`[BEGIN|START TRANSACTION]`/`COMMIT`) 或者隐式地使用事务 (`SET autocommit = 1`)。 +TiDB 可以显式地使用事务(通过 `[BEGIN|START TRANSACTION]`/`COMMIT` 语句定义事务的开始和结束) 或者隐式地使用事务 (`SET autocommit = 1`)。 在自动提交状态下,使用 `[BEGIN|START TRANSACTION]` 语句会显式地开启一个事务,同时也会禁用自动提交,使隐式事务变成显式事务。直到执行 `COMMIT` 或 `ROLLBACK` 语句时才会恢复到此前默认的自动提交状态。 @@ -109,7 +108,7 @@ TiDB **只支持** `SNAPSHOT ISOLATION`,可以通过下面的语句将当前 S SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` -## 事务的惰性检查 +## 惰性检查 TiDB 中,对于普通的 `INSERT` 语句写入的值,会进行惰性检查。惰性检查的含义是,不在 `INSERT` 语句执行时进行唯一约束的检查,而在事务提交时进行唯一约束的检查。 @@ -159,4 +158,57 @@ insert into test values (3); rollback; ``` -以上例子中,第二条语句执行失败。由于调用了 `rollback`,因此事务不会将任何数据写入数据库。 +以上例子中,第二条语句执行失败。由于调用了 `ROLLBACK`,因此事务不会将任何数据写入数据库。 + +## 事务大小 + +对于 TiDB 事务而言,事务太大或太小,都会影响事务的执行效率。 + +### 小事务 + +以如下 query 为例,当 `autocommit = 1` 时,下面三条语句各为一个事务: + +{{< copyable "sql" >}} + +```sql +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +``` + +此时每一条语句都需要经过两阶段提交,频繁的网络交互致使延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句。 + +优化后版本: + +{{< copyable "sql" >}} + +```sql +START TRANSACTION; +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +COMMIT; +``` + +同理,执行 `INSERT` 语句时,建议使用显式事务。 + +> **注意:** +> +> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 + +### 大事务 + +由于 TiDB 两阶段提交的要求,修改数据的单个事务过大时会存在以下问题: + +* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 +* 在第一阶段写入数据耗时增加,与其他事务出现写冲突的概率会指数级增长。 +* 最终导致事务完成提交的耗时增加。 + +因此,TiDB 对事务做了一些限制: + +* 单个事务包含的 SQL 语句不超过 5000 条(默认) +* 每个键值对不超过 6 MB +* 键值对的总数不超过 300000 +* 键值对的总大小不超过 100 MB + +为了使性能达到最优,建议每 100~500 行写入一个事务。 \ No newline at end of file diff --git a/v2.1/reference/transactions/transaction-isolation.md b/v2.1/reference/transactions/transaction-isolation.md index 85bcffbdc6f5..6f291c5bc07a 100644 --- a/v2.1/reference/transactions/transaction-isolation.md +++ b/v2.1/reference/transactions/transaction-isolation.md @@ -1,13 +1,14 @@ --- title: TiDB 事务隔离级别 +summary: 了解 TiDB 事务的隔离级别。 category: reference --- # TiDB 事务隔离级别 -事务隔离级别是数据库事务处理的基础,ACID 中 I,即 Isolation,指的就是事务的隔离性。 +事务隔离级别是数据库事务处理的基础,[ACID](/v2.1/glossary.md#acid) 中的 “I”,即 Isolation,指的就是事务的隔离性。 -SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重复读、串行化。详见下表: +SQL-92 标准定义了 4 种隔离级别:读未提交 (READ UNCOMMITTED)、读已提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。详见下表: | Isolation Level | Dirty Write | Dirty Read | Fuzzy Read | Phantom | | ---------------- | ------------ | ------------ | ------------ | ------------ | @@ -16,13 +17,11 @@ SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重 | REPEATABLE READ | Not Possible | Not possible | Not possible | Possible | | SERIALIZABLE | Not Possible | Not possible | Not possible | Not possible | -TiDB 实现了快照隔离 (Snapshot Isolation) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 +TiDB 实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 > **注意:** > -> 在 2.1 默认设置中,事务的自动重试功能默认开启。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务自动重试及带来的异常](#事务自动重试及带来的异常)。 - -TiDB 使用 [Percolator 事务模型](https://research.google.com/pubs/pub36726.html),当事务启动时会获取全局读时间戳,事务提交时也会获取全局提交时间戳,并以此确定事务的执行顺序,如果想了解 TiDB 事务模型的实现可以详细阅读以下两篇文章:[TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/),[Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/)。 +> 在 TiDB 2.1 中,事务的自动重试功能默认开启。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务重试](/v2.1/reference/transactions/transaction-optimistic.md#重试机制)。 ## 可重复读 @@ -45,56 +44,12 @@ commit; | ### 与 ANSI 可重复读隔离级别的区别 -尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的 Snapshot 隔离级别 (SI)。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 +尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的快照隔离级别。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 ### 与 MySQL 可重复读隔离级别的区别 -MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非 Snapshot 隔离级别,MySQL 可重复读隔离级别的一致性要弱于 Snapshot 隔离级别,也弱于 TiDB 的可重复读隔离级别。 - -## 事务自动重试及带来的异常 - -TiDB 默认进行事务自动重试,重试事务可能会导致更新丢失,从而破坏快照隔离。如果业务可以容忍事务重试导致的异常,或并不关注事务是否以快照隔离级别来执行,则可以开启自动重试。通过设置 `tidb_disable_txn_auto_retry = off` 可开启该项功能。需注意 `tidb_retry_limit` 的值不能为 `0`,否则会禁用自动重试。开启自动重试以后,事务遇到提交出错的可能性会降低。 - -开启自动重试后,显式事务遇到冲突可能会导致最终结果不符合预期。 - -比如下面这两个例子: - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `select balance from t where id = 1;` | `update t set balance = balance -100 where id = 1;` | -| | `update t set balance = balance -100 where id = 2;` | -| // 使用 select 的结果决定后续的逻辑 | `commit;` | -| `if balance > 100 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `update t set balance = balance - 100 where id = 1;` | `delete from t where id = 1;` | -| | `commit;` | -| // 使用 affected_rows 的结果决定后续的逻辑 | | -| `if affected_rows > 0 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -因为 TiDB 自动重试机制会把事务第一次执行的所有语句重新执行一遍,当一个事务里的后续语句是否执行取决于前面语句执行结果的时候,自动重试会违反快照隔离,导致更新丢失。这种情况下,需要在应用层重试整个事务。 - -通过配置 `tidb_disable_txn_auto_retry = on` 变量可以关掉显示事务的重试。 - -{{< copyable "sql" >}} - -```sql -SET GLOBAL tidb_disable_txn_auto_retry = on; -``` - -改变 `tidb_disable_txn_auto_retry` 变量不会影响 `autocommit = 1` 的单语句的隐式事务,因为该语句的自动重试,不会造成丢失更新等异常,即不会破坏事务的隔离性。 - -关掉显式事务重试后,如果出现事务冲突,commit 语句会返回错误,错误信息会包含 `try again later` 这个字符串,应用层可以用来判断遇到的错误是否是可以重试的。 +MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非快照隔离级别,MySQL 可重复读隔离级别的一致性要弱于快照隔离级别,也弱于 TiDB 的可重复读隔离级别。 -如果事务执行过程中包含了应用层的逻辑,建议在应用层添加显式事务的重试,并关闭自动重试。 +## 更多阅读 -`tidb_retry_limit` 变量决定了事务重试的最大次数,默认值为 10,当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。当用户相比于事务隔离性,更关心事务执行的延迟时,可以将它设置为 0,所有冲突的事务都会以最快的方式上报失败给应用层。 +- [TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/) \ No newline at end of file diff --git a/v2.1/reference/transactions/transaction-model.md b/v2.1/reference/transactions/transaction-model.md deleted file mode 100644 index 5b72a91d5718..000000000000 --- a/v2.1/reference/transactions/transaction-model.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: 事务模型 -category: reference ---- - -# 事务模型 - -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 - -## 事务限制 - -由于 TiDB 分布式两阶段提交的要求,修改数据的大事务可能会出现一些问题。因此,TiDB 特意对事务大小设置了一些限制以减少这种影响: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6MB -* 键值对的总大小不超过 100MB - -## 基于事务模型的优化实践 - -由于 TiDB 中的每个事务都需要跟 PD leader 进行两次 round trip,TiDB 中的事务相比于 MySQL 中的事务延迟更高。以如下的 query 为例,用显式事务代替 `autocommit`,可优化该 query 的性能。 - -使用 `autocommit` 的原始版本: - -{{< copyable "sql" >}} - -```sql -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -``` - -优化后的版本: - -{{< copyable "sql" >}} - -```sql -START TRANSACTION; -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -COMMIT; -``` - -> **注意:** -> -> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 diff --git a/v2.1/reference/transactions/transaction-optimistic.md b/v2.1/reference/transactions/transaction-optimistic.md new file mode 100644 index 000000000000..92f25c752e4d --- /dev/null +++ b/v2.1/reference/transactions/transaction-optimistic.md @@ -0,0 +1,174 @@ +--- +title: TiDB 乐观事务模型 +summary: 了解 TiDB 的乐观事务模型。 +category: reference +aliases: ['/docs-cn/v2.1/reference/transactions/transaction-model/'] +--- + +# TiDB 乐观事务模型 + +本文介绍 TiDB 乐观事务的原理,以及相关特性。本文假定你对 [TiDB 的整体架构](/v2.1/architecture.md#tidb-整体架构)、[Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型以及事务的 [ACID 特性](/v2.1/glossary.md#acid)都有一定了解。 + +TiDB 默认使用乐观事务模型,不会出现读写冲突,所有的读操作都不会被写操作阻塞。对于写写冲突,只有在客户端执行 `COMMIT` 时,才会触发两阶段提交并检测是否存在写写冲突。 + +## 乐观事务原理 + +TiDB 中事务使用两阶段提交,流程如下: + +![TiDB 中的两阶段提交](/media/2pc-in-tidb.png) + +1. 客户端开始一个事务。 + + TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 + +2. 客户端发起读请求。 + + 1. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 + 2. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 + +3. 客户端发起写请求。 + + TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** + +4. 客户端发起 commit。 + +5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 + + 1. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 + 2. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 + 3. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 + 4. TiDB 收到所有 prewrite 响应且所有 prewrite 都成功。 + 5. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 + 6. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 + 7. TiDB 收到两阶段提交成功的信息。 + +6. TiDB 向客户端返回事务提交成功的信息。 + +7. TiDB 异步清理本次事务遗留的锁信息。 + +## 优缺点分析 + +通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: + +* 实现原理简单,易于理解。 +* 基于单实例事务实现了跨节点事务。 +* 锁管理实现了去中心化。 + +但 TiDB 事务也存在以下缺点: + +* 两阶段提交使网络交互增多。 +* 需要一个中心化的版本管理服务。 +* 事务数据量过大时易导致内存暴涨。 + +实际应用中,你可以[根据事务的大小进行针对性处理](/v2.1/reference/transactions/overview.md#事务大小),以提高事务的执行效率。 + +## 事务的重试 + +使用乐观事务模型时,在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。为了兼容 MySQL 的悲观事务行为,TiDB 提供了重试机制。 + +### 重试机制 + +当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry = off` 开启自动重试,并通过 `tidb_retry_limit` 设置重试次数: + +```sql +# 设置是否禁用自动重试,默认为 “on”,即不重试。 +tidb_disable_txn_auto_retry = off +# 控制重试次数,默认为 “10”。只有自动重试启用时该参数才会生效。 +# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 +tidb_retry_limit = 10 +``` + +你也可以修改当前 Session 或 Global 的值: + +- Session 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@tidb_retry_limit = 10; + ``` + +- Global 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_retry_limit = 10; + ``` + +> **注意:** +> +> `tidb_retry_limit` 变量决定了事务重试的最大次数。当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。禁用自动重试后,所有冲突的事务都会以最快的方式上报失败信息 (`try again later`) 给应用层。 + +### 重试的局限性 + +TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏[可重复读的隔离级别](/v2.1/reference/transactions/transaction-isolation.md)。 + +事务重试的局限性与其原理有关。事务重试可概括为以下三个步骤: + +1. 重新获取 `start_ts`。 +2. 重新执行包含写操作的 SQL 语句。 +3. 再次进行两阶段提交。 + +第二步中,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。但是当前事务中读到数据的时间与事务真正开始的时间发生了变化,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。因此,当事务中存在依赖查询结果来更新的语句时,重试将无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 + +如果业务可以容忍事务重试导致的异常,或并不关注事务是否以可重复读的隔离级别来执行,则可以开启自动重试。 + +## 冲突检测 + +乐观事务下,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 + +作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: + +- TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 +- TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 + +其中 TiDB 层的冲突检测可以根据场景需要选择打开或关闭,具体配置项如下: + +```toml +# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 +[txn-local-latches] +# 是否开启内存锁,默认为 false,即不开启。 +enabled = false +# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 +# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), +# 设置过小会导致变慢,性能下降。(默认为 2048000) +capacity = 2048000 +``` + +配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: + +* `capacity` 值越小,占用内存小,误判概率越大。 +* `capacity` 值越大,占用内存大,误判概率越小。 + +实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 + +相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: + +```toml +# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 +# 每个 Key hash 到不同的 slot。(默认为 2048000) +scheduler-concurrency = 2048000 +``` + +此外,TiKV 支持监控等待 latch 的时间: + +![Scheduler latch wait duration](/media/optimistic-transaction-metric.png) + +当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 + +## 更多阅读 + +- [Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/) \ No newline at end of file diff --git a/v3.0/TOC.md b/v3.0/TOC.md index 441093df0161..526b0650d0dd 100644 --- a/v3.0/TOC.md +++ b/v3.0/TOC.md @@ -233,9 +233,9 @@ - [基于角色的访问控制](/v3.0/reference/security/role-based-access-control.md) - [TiDB 证书鉴权使用指南](/v3.0/reference/security/cert-based-authentication.md) + 事务 - - [事务语句](/v3.0/reference/transactions/overview.md) - - [事务模型](/v3.0/reference/transactions/transaction-model.md) + - [事务概览](/v3.0/reference/transactions/overview.md) - [隔离级别](/v3.0/reference/transactions/transaction-isolation.md) + - [乐观事务](/v3.0/reference/transactions/transaction-optimistic.md) - [悲观事务](/v3.0/reference/transactions/transaction-pessimistic.md) + 系统数据库 - [`mysql`](/v3.0/reference/system-databases/mysql.md) @@ -268,7 +268,6 @@ - [Grafana 监控最佳实践](/v3.0/reference/best-practices/grafana-monitor.md) - [PD 调度策略最佳实践](/v3.0/reference/best-practices/pd-scheduling.md) - [海量 Region 集群调优最佳实践](/v3.0/reference/best-practices/massive-regions.md) - - [乐观锁事务最佳实践](/v3.0/reference/best-practices/optimistic-transaction.md) + [TiSpark 使用指南](/v3.0/reference/tispark.md) + TiDB Binlog - [概述](/v3.0/reference/tidb-binlog/overview.md) diff --git a/v3.0/glossary.md b/v3.0/glossary.md index dc91ff18aa8b..3b31e69e5d20 100644 --- a/v3.0/glossary.md +++ b/v3.0/glossary.md @@ -1,6 +1,6 @@ --- title: 术语表 -summary: 学习 TiDB 相关术语。 +summary: 了解 TiDB 相关术语。 category: glossary --- @@ -13,29 +13,16 @@ category: glossary ACID 是指数据库管理系统在写入或更新资料的过程中,为保证[事务](#事务)是正确可靠的,所必须具备的四个特性:原子性 (atomicity)、一致性 (consistency)、隔离性(isolation)以及持久性(durability)。 * 原子性 (atomicity) 指一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。TiDB 通过 Primary Key 所在 [Region](#regionpeerraft-group) 的原子性来保证分布式事务的原子性。 - * 一致性 (consistency) 指在事务开始之前和结束以后,数据库的完整性没有被破坏。TiDB 在写入数据之前,会校验数据的一致性,校验通过才会写入内存并返回成功。 - * 隔离性 (isolation) 指数据库允许多个并发事务同时对其数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,主要用于处理并发场景。TiDB 目前只支持一种隔离级别,即可重复读。 - * 持久性 (durability) 指事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。在 TiDB 中,事务一旦提交成功,数据全部持久化存储到 TiKV,此时即使 TiDB 服务器宕机也不会出现数据丢失。 -## B - -### 悲观事务 - -悲观事务假定并发事务会发生冲突,所以每一条 SQL 语句执行后都会检测冲突,只有在确保事务一定能够执行成功后,才开始提交。另有[乐观事务](#乐观事务)。 - ## L ### Leader/Follower/Learner 它们分别对应 [Peer](#regionpeerraft-group) 的三种角色。其中 Leader 负责响应客户端的读写请求;Follower 被动地从 Leader 同步数据,当 Leader 失效时会进行选举产生新的 Leader;Learner 是一种特殊的角色,它只参与同步 raft log 而不参与投票,在目前的实现中只短暂存在于添加副本的中间步骤。 -### 乐观事务 - -乐观事务假定不会发生并发冲突,只有在事务最终提交时才会检测冲突。另有[悲观事务](#悲观事务)。 - ## O ### Operator @@ -86,16 +73,6 @@ Scheduler(调度器)是 PD 中生成调度的组件。PD 中每个调度器 - `hot-region-scheduler`:保持不同节点的读写热点 Region 均衡。 - `evict-leader-{store-id}`:驱逐某个节点的所有 Leader。(常用于滚动升级) -### 事务 - -事务指一系列有限的数据库操作序列。TiDB 中的事务具备 [ACID](#ACID) 四个特性。 - ### Store PD 中的 Store 指的是集群中的存储节点,也就是 tikv-server 实例。Store 与 TiKV 实例是严格一一对应的,即使在同一主机甚至同一块磁盘部署多个 TiKV 实例,这些实例也对会对应不同的 Store。 - -## X - -### 显式事务/隐式事务 - -由事务控制语句定义开始和结束的事务为显式事务。无需定义开始的事务为隐式事务。 \ No newline at end of file diff --git a/v3.0/reference/best-practices/optimistic-transaction.md b/v3.0/reference/best-practices/optimistic-transaction.md deleted file mode 100644 index 8d88ac025ebb..000000000000 --- a/v3.0/reference/best-practices/optimistic-transaction.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: 乐观锁事务最佳实践 -summary: 了解 TiDB 的乐观事务模型。 -category: reference ---- - -# 乐观锁事务最佳实践 - -本文介绍 TiDB 乐观锁机制的实现原理,并通过分析乐观锁在多种场景下的应用为业务提供最佳实践。本文假定你对 [TiDB 的整体架构](/v3.0/architecture.md#tidb-整体架构)和 [Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型都有一定了解,相关核心概念如下: - -- [ACID](/v3.0/glossary.md#acid) -- [事务](/v3.0/glossary.md#事务) -- [乐观事务](/v3.0/glossary.md#乐观事务) -- [悲观事务](/v3.0/glossary.md#悲观事务) -- [显式事务/隐式事务](/v3.0/glossary.md#显式事务隐式事务) - -## 乐观事务原理 - -TiDB 中事务使用两阶段提交,流程如下: - -![TiDB 中的两阶段提交](/media/best-practices/2pc-in-tidb.png) - -1. 客户端开始一个事务。 - - TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 - -2. 客户端发起读请求。 - - a. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 - - b. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 - -3. 客户端发起写请求。 - - TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** - -4. 客户端发起 commit。 - -5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 - - a. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 - - b. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 - - c. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 - - d. TiDB 成功收到所有 prewrite 请求。 - - e. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 - - f. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 - - g. TiDB 收到 f 成功信息。 - -6. TiDB 向客户端返回事务提交成功的信息。 - -7. TiDB 异步清理本次事务遗留的锁信息。 - -## 优缺点分析 - -通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: - -* 实现原理简单,易于理解。 -* 基于单实例事务实现了跨节点事务。 -* 锁管理实现了去中心化。 - -但 TiDB 事务也存在以下缺点: - -* 两阶段提交使网络交互增多。 -* 缺少一个中心化的版本管理服务。 -* 事务数据量过大时易导致内存暴涨。 - -## 事务大小 - -对于 TiDB 乐观事务而言,事务太大或者太小,都会影响事务性能。为了克服上述事务在处理过程中的不足,在实际应用中可以根据事务大小进行针对性处理。 - -### 小事务 - -在自动提交状态 (`autocommit = 1`) 下,下面三条语句各为一个事务: - -```sql -# 使用自动提交的原始版本。 -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -``` - -此时每一条语句都需要经过两阶段提交,频繁的网络交互致使小事务延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句: - -```sql -# 优化后版本。 -START TRANSACTION; -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -COMMIT; -``` - -同理,执行 `INSERT` 语句时,建议使用显式事务。 - -### 大事务 - -通过分析两阶段提交的过程,可以发现单个事务过大时会存在以下问题: - -* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 -* 在第一阶段写入数据时,与其他事务出现冲突的概率会指数级增长,使事务之间相互阻塞影响。 -* 最终导致事务完成提交的耗时增加。 - -因此,TiDB 特意对事务的大小做了一些限制: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6 MB -* 键值对的总数不超过 300000 -* 键值对的总大小不超过 100 MB - -为了使性能达到最优,建议每 100~500 行写入一个事务。 - -## 事务冲突 - -事务的冲突,主要指事务并发执行时对相同的 Key 进行了读写操作。冲突主要有两种形式: - -* 读写冲突:部分事务进行读操作时,有事务在同一时间对相同的 Key 进行写操作。 -* 写写冲突:不同事务同时对相同的 Key 进行写操作。 - -在 TiDB 的乐观锁机制中,只有在客户端执行 `commit` 时,才会触发两阶段提交并检测是否存在写写冲突。也就是说,在乐观事务下,如果存在写写冲突,在事务提交阶段就会暴露出来,因而更容易被用户感知。 - -### 默认冲突行为 - -乐观事务下,默认在最终提交时才会进行冲突检测。当两个事务同时更新同一行数据,即并发事务存在冲突时,不同时间点的执行结果如下: - -![并发事务冲突流程](/media/best-practices/optimistic-transaction-table1.png) - -根据乐观锁检测写写冲突的设定,该实例的执行逻辑分析如下: - -![并发事务冲突逻辑](/media/best-practices/optimistic-transaction-case1.png) - -1. 如上图,事务 A 在时间点 `t1` 开始,事务 B 在 `t2` 开始。 - -2. 事务 A、事务 B 同时更新同一行数据。 - -3. `t4` 时,事务 A 更新 `id = 1` 的同一行数据。 虽然 `t3` 时,事务 B 已经更新了这一行数据,但是乐观事务只有在事务 commit 时才检测冲突,因此 `t4` 的操作执行成功了。 - -4. `t5` 时,事务 B 成功提交,数据落盘。 - -5. `t6` 时,事务 A 尝试提交,检测冲突时发现 `t1` 之后有新的数据写入,因此返回错误,提示客户端重试,事务 A 提交失败。 - -### 重试机制 - -TiDB 中默认使用乐观事务模型,因而在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,对应到上面的实例中,事务 A 在 `t4` 时就会返回错误,提示客户端根据需求去重试。 - -换言之,MySQL 在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。由于 TiDB 使用乐观锁机制造成了两边行为不一致,要兼容 MySQL 的悲观事务行为,需要在客户端修改大量的代码。为了便于广大 MySQL 用户使用,TiDB 提供了重试机制。当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry` 和 `tidb_retry_limit` 开启自动重试: - -```toml -# 用于设置是否禁用自动重试,默认不重试。 -tidb_disable_txn_auto_retry = on -# 用来控制重试次数。只有自动重试启用时该参数才会生效。 -# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 -tidb_retry_limit = 10 -``` - -推荐通过以下两种方式进行参数设置: - -1. Session 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@tidb_disable_txn_auto_retry = off; - set @@tidb_retry_limit = 10; - ``` - -2. Global 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@global.tidb_disable_txn_auto_retry = off; - set @@global.tidb_retry_limit = 10; - ``` - -### 重试的局限性 - -基于重试机制的原理,可将重试过程概括为以下三个步骤: - -1. 重新获取 `start_ts`。 - -2. 重新执行包含写操作的 SQL 语句。 - -3. 两阶段提交。 - -根据第二步,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。这会引发以下问题: - -1. `start_ts` 发生了变更。当前事务中,读到数据的时间与事务真正开始的时间发生了变化。同理,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。 - -2. 当前事务中,如果存在依赖查询结果来更新的语句,结果将变得不可控。 - -以下实例来具体说明了重试的局限性。开启自动重试后,当同时更新同一行数据时,Session A 和 Session B 在不同时间点的执行结果如下: - -![自动重试流程](/media/best-practices/optimistic-transaction-table2.png) - -该实例的执行逻辑分析如下: - -![自动重试逻辑](/media/best-practices/optimistic-transaction-case2.png) - -1. 如图,Session B 在 `t2` 时开始事务 2,`t5` 时提交成功。Session A 的事务 1 在事务 2 之前开始,在事务 2 提交完成后提交。 - -2. 事务 1、事务 2 同时更新同一行数据。 - -3. Session A 提交事务 1 时发现冲突,TiDB 内部重试事务 1。 - 1. 重新取得新的 `start_ts` 为 `t8’`。 - 2. 重新执行更新语句 `update tidb set name='pd' where id =1 and status=1`。 - 1. 发现当前版本 `t8’` 下并不存在符合条件的语句,不需要更新。 - 2. 没有数据更新,返回上层成功。 - -4. TiDB 认为事务 1 重试成功,返回客户端成功。 - -5. Session A 认为事务执行成功。如果在不存在其他更新,此时查询结果会发现数据与预想的不一致。 - -由上述分析可知,对于重试事务,当事务中更新语句需要依赖查询结果时,会重新取版本号作为 `start_ts`,所以无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 - -因此,如果存在依赖查询结果来更新 SQL 语句的事务,建议不要打开 TiDB 乐观锁的重试机制。 - -### 冲突预检 - -由上文可以知道,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 - -作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: - -* TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 -* TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 - -其中 TiDB 层的冲突检测可以选择关闭,具体配置项如下: - -```toml -# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 -[txn-local-latches] -# 是否开启内存锁,默认为关闭。 -enabled = false -# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 -# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), -# 设置过小会导致变慢,性能下降。(默认为 1024000) -capacity = 1024000 -``` - -配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: - -* `capacity` 值越小,占用内存小,误判概率越大。 -* `capacity` 值越大,占用内存大,误判概率越小。 - -实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 - -相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: - -```toml -# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 -# 每个 Key hash 到不同的 slot。(默认为 2048000) -scheduler-concurrency = 2048000 -``` - -此外,TiKV 支持监控等待 latch 的时间: - -![Scheduler latch wait duration](/media/best-practices/optimistic-transaction-metric.png) - -当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 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..538f625e3938 100644 --- a/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md @@ -313,7 +313,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 默认值:10 -这个变量用来设置最多可重试次数,即在一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。 +这个变量用来设置最大重试次数。一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,会根据该变量的设置进行重试。注意当 `tidb_retry_limit = 0` 时,也会禁用自动重试。 ### tidb_disable_txn_auto_retry @@ -327,7 +327,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 `tidb_retry_limit` 的值来决定最大重试次数。 -是否需要禁用自动重试,请参考[事务自动重试及带来的异常](/v3.0/reference/transactions/transaction-isolation.md#事务自动重试及带来的异常)。 +是否需要禁用自动重试,请参考[重试的局限性](/v3.0/reference/transactions/transaction-optimistic.md#重试的局限性)。 ### tidb_backoff_weight diff --git a/v3.0/reference/mysql-compatibility.md b/v3.0/reference/mysql-compatibility.md index 1bd4b14a8aeb..9076720e31ba 100644 --- a/v3.0/reference/mysql-compatibility.md +++ b/v3.0/reference/mysql-compatibility.md @@ -13,7 +13,7 @@ TiDB 支持 MySQL 传输协议及其绝大多数的语法。这意味着您现 > **注意:** > -> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v3.0/reference/security/compatibility.md)及[事务模型](/v3.0/reference/transactions/transaction-model.md)的兼容信息请查看各自具体页面。 +> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v3.0/reference/security/compatibility.md)、[悲观事务模型](/v3.0/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)的兼容信息请查看各自具体页面。 ## 不支持的特性 diff --git a/v3.0/reference/sql/statements/load-data.md b/v3.0/reference/sql/statements/load-data.md index 7c47cd082672..ab249aa40db4 100644 --- a/v3.0/reference/sql/statements/load-data.md +++ b/v3.0/reference/sql/statements/load-data.md @@ -59,4 +59,4 @@ Records: 815264 Deleted: 0 Skipped: 0 Warnings: 0 ## 另请参阅 * [INSERT](/v3.0/reference/sql/statements/insert.md) -* [Transaction Model](/v3.0/reference/transactions/transaction-model.md) +* [乐观事务模型](/v3.0/reference/transactions/transaction-optimistic.md) diff --git a/v3.0/reference/sql/statements/select.md b/v3.0/reference/sql/statements/select.md index 5fdfc9dcad07..ddb41b9bfbbd 100644 --- a/v3.0/reference/sql/statements/select.md +++ b/v3.0/reference/sql/statements/select.md @@ -75,7 +75,7 @@ aliases: ['/docs-cn/sql/dml/'] |`HAVING where_condition` | Having 子句与 Where 子句作用类似,Having 子句可以让过滤 GroupBy 后的各种数据,Where 子句用于在聚合前过滤记录。| |`ORDER BY` | OrderBy 子句用于指定结果排序顺序,可以按照列、表达式或者是 `select_expr` 列表中某个位置的字段进行排序。| |`LIMIT` | Limit 子句用于限制结果条数。Limit 接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是 0),第二个参数指定返回数据的最大条目数。| -|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。TiDB 使用[乐观事务模型](/v3.0/reference/transactions/transaction-model.md#事务模型)在语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 UPDATE、DELETE 和 SELECT FOR UPDATE。在事务的提交阶段 SELECT FOR UPDATE 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 SELECT FOR UPDATE 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。| +|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。使用[乐观事务模型](/v3.0/reference/transactions/transaction-optimistic.md)时,语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 `UPDATE`、`DELETE` 和 `SELECT FOR UPDATE`。在事务的提交阶段 `SELECT FOR UPDATE` 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 `SELECT FOR UPDATE` 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。若使用悲观事务,则行为与其他数据库基本相同,不一致之处参考[和 MySQL InnoDB 的差异](/v3.0/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)。 | |`LOCK IN SHARE MODE` | TiDB 出于兼容性解析这个语法,但是不做任何处理| ## 示例 diff --git a/v3.0/reference/transactions/overview.md b/v3.0/reference/transactions/overview.md index 91a795eae20f..d1020e90bb00 100644 --- a/v3.0/reference/transactions/overview.md +++ b/v3.0/reference/transactions/overview.md @@ -1,15 +1,16 @@ --- title: TiDB 事务概览 +summary: 了解 TiDB 中的事务。 category: reference --- # TiDB 事务概览 -TiDB 支持完整的分布式事务。本文主要介绍涉及到事务的语句、显式/隐式事务以及事务的隔离级别和惰性检查。 +TiDB 支持完整的分布式事务,提供[乐观事务](/v3.0/reference/transactions/transaction-optimistic.md)与[悲观事务](/v3.0/reference/transactions/transaction-pessimistic.md)(TiDB 3.0 中引入)两种事务模型。本文主要介绍涉及到事务的语句、显式/隐式事务、事务的隔离级别和惰性检查,以及事务大小的限制。 -常用的变量包括 `autocommit`、[`tidb_disable_txn_auto_retry`](/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 +常用的变量包括 [`autocommit`](#自动提交)、[`tidb_disable_txn_auto_retry`](/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v3.0/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 -## 事务常用语句 +## 常用事务语句 ### `BEGIN` 和 `START TRANSACTION` @@ -69,13 +70,11 @@ ROLLBACK; SET autocommit = {0 | 1} ``` -当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态。设置 `autocommit = 0` 时将更改当前 Session 为非自动提交状态。 - -自动提交状态下,每条语句运行后,TiDB 会自动将修改提交到数据库中。非自动提交状态下,通过执行 `COMMIT` 语句来手动提交事务。 +当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态,即每条语句运行后,TiDB 会自动将修改提交到数据库中。设置 `autocommit = 0` 时更改当前 Session 更改为非自动提交状态,通过执行 `COMMIT` 语句来手动提交事务。 > **注意:** > -> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句的时候,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 +> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句时,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 另外,`autocommit` 也是一个系统变量,你可以通过变量赋值语句修改当前 Session 或 Global 的值。 @@ -93,7 +92,7 @@ SET @@GLOBAL.autocommit = {0 | 1}; ## 显式事务和隐式事务 -TiDB 可以显式地使用事务 (`[BEGIN|START TRANSACTION]`/`COMMIT`) 或者隐式地使用事务 (`SET autocommit = 1`)。 +TiDB 可以显式地使用事务(通过 `[BEGIN|START TRANSACTION]`/`COMMIT` 语句定义事务的开始和结束) 或者隐式地使用事务 (`SET autocommit = 1`)。 在自动提交状态下,使用 `[BEGIN|START TRANSACTION]` 语句会显式地开启一个事务,同时也会禁用自动提交,使隐式事务变成显式事务。直到执行 `COMMIT` 或 `ROLLBACK` 语句时才会恢复到此前默认的自动提交状态。 @@ -109,7 +108,7 @@ TiDB **只支持** `SNAPSHOT ISOLATION`,可以通过下面的语句将当前 S SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` -## 事务的惰性检查 +## 惰性检查 TiDB 中,对于普通的 `INSERT` 语句写入的值,会进行惰性检查。惰性检查的含义是,不在 `INSERT` 语句执行时进行唯一约束的检查,而在事务提交时进行唯一约束的检查。 @@ -159,4 +158,57 @@ insert into test values (3); rollback; ``` -以上例子中,第二条语句执行失败。由于调用了 `rollback`,因此事务不会将任何数据写入数据库。 +以上例子中,第二条语句执行失败。由于调用了 `ROLLBACK`,因此事务不会将任何数据写入数据库。 + +## 事务大小 + +对于 TiDB 事务而言,事务太大或太小,都会影响事务的执行效率。 + +### 小事务 + +以如下 query 为例,当 `autocommit = 1` 时,下面三条语句各为一个事务: + +{{< copyable "sql" >}} + +```sql +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +``` + +此时每一条语句都需要经过两阶段提交,频繁的网络交互致使延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句。 + +优化后版本: + +{{< copyable "sql" >}} + +```sql +START TRANSACTION; +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +COMMIT; +``` + +同理,执行 `INSERT` 语句时,建议使用显式事务。 + +> **注意:** +> +> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 + +### 大事务 + +由于 TiDB 两阶段提交的要求,修改数据的单个事务过大时会存在以下问题: + +* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 +* 在第一阶段写入数据耗时增加,与其他事务出现写冲突的概率会指数级增长。 +* 最终导致事务完成提交的耗时增加。 + +因此,TiDB 对事务做了一些限制: + +* 单个事务包含的 SQL 语句不超过 5000 条(默认) +* 每个键值对不超过 6 MB +* 键值对的总数不超过 300000 +* 键值对的总大小不超过 100 MB + +为了使性能达到最优,建议每 100~500 行写入一个事务。 \ No newline at end of file diff --git a/v3.0/reference/transactions/transaction-isolation.md b/v3.0/reference/transactions/transaction-isolation.md index 69a0fc863579..e2c4c2823eb6 100644 --- a/v3.0/reference/transactions/transaction-isolation.md +++ b/v3.0/reference/transactions/transaction-isolation.md @@ -1,13 +1,14 @@ --- title: TiDB 事务隔离级别 +summary: 了解 TiDB 事务的隔离级别。 category: reference --- # TiDB 事务隔离级别 -事务隔离级别是数据库事务处理的基础,ACID 中 I,即 Isolation,指的就是事务的隔离性。 +事务隔离级别是数据库事务处理的基础,[ACID](/v3.0/glossary.md#acid) 中的 “I”,即 Isolation,指的就是事务的隔离性。 -SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重复读、串行化。详见下表: +SQL-92 标准定义了 4 种隔离级别:读未提交 (READ UNCOMMITTED)、读已提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。详见下表: | Isolation Level | Dirty Write | Dirty Read | Fuzzy Read | Phantom | | ---------------- | ------------ | ------------ | ------------ | ------------ | @@ -16,13 +17,11 @@ SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重 | REPEATABLE READ | Not Possible | Not possible | Not possible | Possible | | SERIALIZABLE | Not Possible | Not possible | Not possible | Not possible | -TiDB 实现了快照隔离 (Snapshot Isolation) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 +TiDB 实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 > **注意:** > -> 在 TiDB v3.0 的默认设置中,事务的自动重试功能已经关闭。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务自动重试及带来的异常](#事务自动重试及带来的异常)。 - -TiDB 使用 [Percolator 事务模型](https://research.google.com/pubs/pub36726.html),当事务启动时会获取全局读时间戳,事务提交时也会获取全局提交时间戳,并以此确定事务的执行顺序,如果想了解 TiDB 事务模型的实现可以详细阅读以下两篇文章:[TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/),[Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/)。 +> 在 TiDB v3.0 中,事务的自动重试功能默认为禁用状态。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务重试](/v3.0/reference/transactions/transaction-optimistic.md#重试机制)。 ## 可重复读 @@ -45,56 +44,12 @@ commit; | ### 与 ANSI 可重复读隔离级别的区别 -尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的 Snapshot 隔离级别 (SI)。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 +尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的快照隔离级别。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 ### 与 MySQL 可重复读隔离级别的区别 -MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非 Snapshot 隔离级别,MySQL 可重复读隔离级别的一致性要弱于 Snapshot 隔离级别,也弱于 TiDB 的可重复读隔离级别。 - -## 事务自动重试及带来的异常 - -TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏快照隔离。如果业务可以容忍事务重试导致的异常,或并不关注事务是否以快照隔离级别来执行,则可以开启自动重试。通过设置 `tidb_disable_txn_auto_retry = off` 可开启该项功能。需注意 `tidb_retry_limit` 的值不能为 `0`,否则会禁用自动重试。开启自动重试以后,事务遇到提交出错的可能性会降低。 - -开启自动重试后,显式事务遇到冲突可能会导致最终结果不符合预期。 - -比如下面这两个例子: - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `select balance from t where id = 1;` | `update t set balance = balance -100 where id = 1;` | -| | `update t set balance = balance -100 where id = 2;` | -| // 使用 select 的结果决定后续的逻辑 | `commit;` | -| `if balance > 100 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `update t set balance = balance - 100 where id = 1;` | `delete from t where id = 1;` | -| | `commit;` | -| // 使用 affected_rows 的结果决定后续的逻辑 | | -| `if affected_rows > 0 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -因为 TiDB 自动重试机制会把事务第一次执行的所有语句重新执行一遍,当一个事务里的后续语句是否执行取决于前面语句执行结果的时候,自动重试会违反快照隔离,导致更新丢失。这种情况下,需要在应用层重试整个事务。 - -通过配置 `tidb_disable_txn_auto_retry = on` 变量可以关掉显示事务的重试。 - -{{< copyable "sql" >}} - -```sql -SET GLOBAL tidb_disable_txn_auto_retry = on; -``` - -改变 `tidb_disable_txn_auto_retry` 变量不会影响 `autocommit = 1` 的单语句的隐式事务,因为该语句的自动重试,不会造成丢失更新等异常,即不会破坏事务的隔离性。 - -关掉显式事务重试后,如果出现事务冲突,commit 语句会返回错误,错误信息会包含 `try again later` 这个字符串,应用层可以用来判断遇到的错误是否是可以重试的。 +MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非快照隔离级别,MySQL 可重复读隔离级别的一致性要弱于快照隔离级别,也弱于 TiDB 的可重复读隔离级别。 -如果事务执行过程中包含了应用层的逻辑,建议在应用层添加显式事务的重试,并关闭自动重试。 +## 更多阅读 -`tidb_retry_limit` 变量决定了事务重试的最大次数,默认值为 10,当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。当用户相比于事务隔离性,更关心事务执行的延迟时,可以将它设置为 0,所有冲突的事务都会以最快的方式上报失败给应用层。 +- [TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/) \ No newline at end of file diff --git a/v3.0/reference/transactions/transaction-model.md b/v3.0/reference/transactions/transaction-model.md deleted file mode 100644 index 5b72a91d5718..000000000000 --- a/v3.0/reference/transactions/transaction-model.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: 事务模型 -category: reference ---- - -# 事务模型 - -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 - -## 事务限制 - -由于 TiDB 分布式两阶段提交的要求,修改数据的大事务可能会出现一些问题。因此,TiDB 特意对事务大小设置了一些限制以减少这种影响: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6MB -* 键值对的总大小不超过 100MB - -## 基于事务模型的优化实践 - -由于 TiDB 中的每个事务都需要跟 PD leader 进行两次 round trip,TiDB 中的事务相比于 MySQL 中的事务延迟更高。以如下的 query 为例,用显式事务代替 `autocommit`,可优化该 query 的性能。 - -使用 `autocommit` 的原始版本: - -{{< copyable "sql" >}} - -```sql -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -``` - -优化后的版本: - -{{< copyable "sql" >}} - -```sql -START TRANSACTION; -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -COMMIT; -``` - -> **注意:** -> -> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 diff --git a/v3.0/reference/transactions/transaction-optimistic.md b/v3.0/reference/transactions/transaction-optimistic.md new file mode 100644 index 000000000000..b1fe521b673a --- /dev/null +++ b/v3.0/reference/transactions/transaction-optimistic.md @@ -0,0 +1,178 @@ +--- +title: TiDB 乐观事务模型 +summary: 了解 TiDB 的乐观事务模型。 +category: reference +aliases: ['/docs-cn/v3.0/reference/transactions/transaction-model/'] +--- + +# TiDB 乐观事务模型 + +本文介绍 TiDB 乐观事务的原理,以及相关特性。本文假定你对 [TiDB 的整体架构](/v3.0/architecture.md#tidb-整体架构)、[Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型以及事务的 [ACID 特性](/v3.0/glossary.md#acid)都有一定了解。 + +TiDB 默认使用乐观事务模型,不会出现读写冲突,所有的读操作都不会被写操作阻塞。对于写写冲突,只有在客户端执行 `COMMIT` 时,才会触发两阶段提交并检测是否存在写写冲突。 + +> **注意:** +> +> 自 v3.0.8 开始,TiDB 默认使用[悲观事务模型](/v3.0/reference/transactions/transaction-pessimistic.md)。但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 + +## 乐观事务原理 + +TiDB 中事务使用两阶段提交,流程如下: + +![TiDB 中的两阶段提交](/media/2pc-in-tidb.png) + +1. 客户端开始一个事务。 + + TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 + +2. 客户端发起读请求。 + + 1. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 + 2. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 + +3. 客户端发起写请求。 + + TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** + +4. 客户端发起 commit。 + +5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 + + 1. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 + 2. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 + 3. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 + 4. TiDB 收到所有 prewrite 响应且所有 prewrite 都成功。 + 5. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 + 6. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 + 7. TiDB 收到两阶段提交成功的信息。 + +6. TiDB 向客户端返回事务提交成功的信息。 + +7. TiDB 异步清理本次事务遗留的锁信息。 + +## 优缺点分析 + +通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: + +* 实现原理简单,易于理解。 +* 基于单实例事务实现了跨节点事务。 +* 锁管理实现了去中心化。 + +但 TiDB 事务也存在以下缺点: + +* 两阶段提交使网络交互增多。 +* 需要一个中心化的版本管理服务。 +* 事务数据量过大时易导致内存暴涨。 + +实际应用中,你可以[根据事务的大小进行针对性处理](/v3.0/reference/transactions/overview.md#事务大小),以提高事务的执行效率。 + +## 事务的重试 + +使用乐观事务模型时,在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。为了兼容 MySQL 的悲观事务行为,TiDB 提供了重试机制。 + +### 重试机制 + +当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry = off` 开启自动重试,并通过 `tidb_retry_limit` 设置重试次数: + +```sql +# 设置是否禁用自动重试,默认为 “on”,即不重试。 +tidb_disable_txn_auto_retry = off +# 控制重试次数,默认为 “10”。只有自动重试启用时该参数才会生效。 +# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 +tidb_retry_limit = 10 +``` + +你也可以修改当前 Session 或 Global 的值: + +- Session 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@tidb_retry_limit = 10; + ``` + +- Global 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_retry_limit = 10; + ``` + +> **注意:** +> +> `tidb_retry_limit` 变量决定了事务重试的最大次数。当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。禁用自动重试后,所有冲突的事务都会以最快的方式上报失败信息 (`try again later`) 给应用层。 + +### 重试的局限性 + +TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏[可重复读的隔离级别](/v3.0/reference/transactions/transaction-isolation.md)。 + +事务重试的局限性与其原理有关。事务重试可概括为以下三个步骤: + +1. 重新获取 `start_ts`。 +2. 重新执行包含写操作的 SQL 语句。 +3. 再次进行两阶段提交。 + +第二步中,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。但是当前事务中读到数据的时间与事务真正开始的时间发生了变化,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。因此,当事务中存在依赖查询结果来更新的语句时,重试将无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 + +如果业务可以容忍事务重试导致的异常,或并不关注事务是否以可重复读的隔离级别来执行,则可以开启自动重试。 + +## 冲突检测 + +乐观事务下,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 + +作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: + +- TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 +- TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 + +其中 TiDB 层的冲突检测可以根据场景需要选择打开或关闭,具体配置项如下: + +```toml +# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 +[txn-local-latches] +# 是否开启内存锁,默认为 false,即不开启。 +enabled = false +# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 +# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), +# 设置过小会导致变慢,性能下降。(默认为 2048000) +capacity = 2048000 +``` + +配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: + +* `capacity` 值越小,占用内存小,误判概率越大。 +* `capacity` 值越大,占用内存大,误判概率越小。 + +实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 + +相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: + +```toml +# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 +# 每个 Key hash 到不同的 slot。(默认为 2048000) +scheduler-concurrency = 2048000 +``` + +此外,TiKV 支持监控等待 latch 的时间: + +![Scheduler latch wait duration](/media/optimistic-transaction-metric.png) + +当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 + +## 更多阅读 + +- [Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/) \ No newline at end of file diff --git a/v3.0/reference/transactions/transaction-pessimistic.md b/v3.0/reference/transactions/transaction-pessimistic.md index 005f49aa4d19..99d5e6d4498f 100644 --- a/v3.0/reference/transactions/transaction-pessimistic.md +++ b/v3.0/reference/transactions/transaction-pessimistic.md @@ -1,12 +1,12 @@ --- -title: TiDB 悲观事务模式 +title: TiDB 悲观事务模型 +summary: 了解 TiDB 的悲观事务模型。 category: reference --- -# TiDB 悲观事务模式 +# TiDB 悲观事务模型 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 -悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +TiDB 的乐观事务模型会导致事务提交时因为冲突而失败。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 ## 悲观事务模式的行为 diff --git a/v3.1/TOC.md b/v3.1/TOC.md index 8e818cf69e63..f0505d11345c 100644 --- a/v3.1/TOC.md +++ b/v3.1/TOC.md @@ -236,9 +236,9 @@ - [基于角色的访问控制](/v3.1/reference/security/role-based-access-control.md) - [TiDB 证书鉴权使用指南](/v3.1/reference/security/cert-based-authentication.md) + 事务 - - [事务语句](/v3.1/reference/transactions/overview.md) - - [事务模型](/v3.1/reference/transactions/transaction-model.md) + - [事务概览](/v3.1/reference/transactions/overview.md) - [隔离级别](/v3.1/reference/transactions/transaction-isolation.md) + - [乐观事务](/v3.1/reference/transactions/transaction-optimistic.md) - [悲观事务](/v3.1/reference/transactions/transaction-pessimistic.md) + 系统数据库 - [`mysql`](/v3.1/reference/system-databases/mysql.md) @@ -272,7 +272,6 @@ - [Grafana 监控最佳实践](/v3.1/reference/best-practices/grafana-monitor.md) - [PD 调度策略最佳实践](/v3.1/reference/best-practices/pd-scheduling.md) - [海量 Region 集群调优最佳实践](/v3.1/reference/best-practices/massive-regions.md) - - [乐观锁事务最佳实践](/v3.1/reference/best-practices/optimistic-transaction.md) + [TiSpark 使用指南](/v3.1/reference/tispark.md) + TiDB Binlog - [概述](/v3.1/reference/tidb-binlog/overview.md) diff --git a/v3.1/glossary.md b/v3.1/glossary.md index dc91ff18aa8b..3b31e69e5d20 100644 --- a/v3.1/glossary.md +++ b/v3.1/glossary.md @@ -1,6 +1,6 @@ --- title: 术语表 -summary: 学习 TiDB 相关术语。 +summary: 了解 TiDB 相关术语。 category: glossary --- @@ -13,29 +13,16 @@ category: glossary ACID 是指数据库管理系统在写入或更新资料的过程中,为保证[事务](#事务)是正确可靠的,所必须具备的四个特性:原子性 (atomicity)、一致性 (consistency)、隔离性(isolation)以及持久性(durability)。 * 原子性 (atomicity) 指一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。TiDB 通过 Primary Key 所在 [Region](#regionpeerraft-group) 的原子性来保证分布式事务的原子性。 - * 一致性 (consistency) 指在事务开始之前和结束以后,数据库的完整性没有被破坏。TiDB 在写入数据之前,会校验数据的一致性,校验通过才会写入内存并返回成功。 - * 隔离性 (isolation) 指数据库允许多个并发事务同时对其数据进行读写和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,主要用于处理并发场景。TiDB 目前只支持一种隔离级别,即可重复读。 - * 持久性 (durability) 指事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。在 TiDB 中,事务一旦提交成功,数据全部持久化存储到 TiKV,此时即使 TiDB 服务器宕机也不会出现数据丢失。 -## B - -### 悲观事务 - -悲观事务假定并发事务会发生冲突,所以每一条 SQL 语句执行后都会检测冲突,只有在确保事务一定能够执行成功后,才开始提交。另有[乐观事务](#乐观事务)。 - ## L ### Leader/Follower/Learner 它们分别对应 [Peer](#regionpeerraft-group) 的三种角色。其中 Leader 负责响应客户端的读写请求;Follower 被动地从 Leader 同步数据,当 Leader 失效时会进行选举产生新的 Leader;Learner 是一种特殊的角色,它只参与同步 raft log 而不参与投票,在目前的实现中只短暂存在于添加副本的中间步骤。 -### 乐观事务 - -乐观事务假定不会发生并发冲突,只有在事务最终提交时才会检测冲突。另有[悲观事务](#悲观事务)。 - ## O ### Operator @@ -86,16 +73,6 @@ Scheduler(调度器)是 PD 中生成调度的组件。PD 中每个调度器 - `hot-region-scheduler`:保持不同节点的读写热点 Region 均衡。 - `evict-leader-{store-id}`:驱逐某个节点的所有 Leader。(常用于滚动升级) -### 事务 - -事务指一系列有限的数据库操作序列。TiDB 中的事务具备 [ACID](#ACID) 四个特性。 - ### Store PD 中的 Store 指的是集群中的存储节点,也就是 tikv-server 实例。Store 与 TiKV 实例是严格一一对应的,即使在同一主机甚至同一块磁盘部署多个 TiKV 实例,这些实例也对会对应不同的 Store。 - -## X - -### 显式事务/隐式事务 - -由事务控制语句定义开始和结束的事务为显式事务。无需定义开始的事务为隐式事务。 \ No newline at end of file diff --git a/v3.1/reference/best-practices/optimistic-transaction.md b/v3.1/reference/best-practices/optimistic-transaction.md deleted file mode 100644 index 68daf4b59f5d..000000000000 --- a/v3.1/reference/best-practices/optimistic-transaction.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: 乐观锁事务最佳实践 -summary: 了解 TiDB 的乐观事务模型。 -category: reference ---- - -# 乐观锁事务最佳实践 - -本文介绍 TiDB 乐观锁机制的实现原理,并通过分析乐观锁在多种场景下的应用为业务提供最佳实践。本文假定你对 [TiDB 的整体架构](/v3.1/architecture.md#tidb-整体架构)和 [Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型都有一定了解,相关核心概念如下: - -- [ACID](/v3.1/glossary.md#acid) -- [事务](/v3.1/glossary.md#事务) -- [乐观事务](/v3.1/glossary.md#乐观事务) -- [悲观事务](/v3.1/glossary.md#悲观事务) -- [显式事务/隐式事务](/v3.1/glossary.md#显式事务隐式事务) - -## 乐观事务原理 - -TiDB 中事务使用两阶段提交,流程如下: - -![TiDB 中的两阶段提交](/media/best-practices/2pc-in-tidb.png) - -1. 客户端开始一个事务。 - - TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 - -2. 客户端发起读请求。 - - a. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 - - b. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 - -3. 客户端发起写请求。 - - TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** - -4. 客户端发起 commit。 - -5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 - - a. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 - - b. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 - - c. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 - - d. TiDB 成功收到所有 prewrite 请求。 - - e. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 - - f. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 - - g. TiDB 收到 f 成功信息。 - -6. TiDB 向客户端返回事务提交成功的信息。 - -7. TiDB 异步清理本次事务遗留的锁信息。 - -## 优缺点分析 - -通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: - -* 实现原理简单,易于理解。 -* 基于单实例事务实现了跨节点事务。 -* 锁管理实现了去中心化。 - -但 TiDB 事务也存在以下缺点: - -* 两阶段提交使网络交互增多。 -* 缺少一个中心化的版本管理服务。 -* 事务数据量过大时易导致内存暴涨。 - -## 事务大小 - -对于 TiDB 乐观事务而言,事务太大或者太小,都会影响事务性能。为了克服上述事务在处理过程中的不足,在实际应用中可以根据事务大小进行针对性处理。 - -### 小事务 - -在自动提交状态 (`autocommit = 1`) 下,下面三条语句各为一个事务: - -```sql -# 使用自动提交的原始版本。 -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -``` - -此时每一条语句都需要经过两阶段提交,频繁的网络交互致使小事务延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句: - -```sql -# 优化后版本。 -START TRANSACTION; -UPDATE my_table SET a ='new_value' WHERE id = 1; -UPDATE my_table SET a ='newer_value' WHERE id = 2; -UPDATE my_table SET a ='newest_value' WHERE id = 3; -COMMIT; -``` - -同理,执行 `INSERT` 语句时,建议使用显式事务。 - -### 大事务 - -通过分析两阶段提交的过程,可以发现单个事务过大时会存在以下问题: - -* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 -* 在第一阶段写入数据时,与其他事务出现冲突的概率会指数级增长,使事务之间相互阻塞影响。 -* 最终导致事务完成提交的耗时增加。 - -因此,TiDB 特意对事务的大小做了一些限制: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6 MB -* 键值对的总数不超过 300000 -* 键值对的总大小不超过 100 MB - -为了使性能达到最优,建议每 100~500 行写入一个事务。 - -## 事务冲突 - -事务的冲突,主要指事务并发执行时对相同的 Key 进行了读写操作。冲突主要有两种形式: - -* 读写冲突:部分事务进行读操作时,有事务在同一时间对相同的 Key 进行写操作。 -* 写写冲突:不同事务同时对相同的 Key 进行写操作。 - -在 TiDB 的乐观锁机制中,只有在客户端执行 `commit` 时,才会触发两阶段提交并检测是否存在写写冲突。也就是说,在乐观事务下,如果存在写写冲突,在事务提交阶段就会暴露出来,因而更容易被用户感知。 - -### 默认冲突行为 - -乐观事务下,默认在最终提交时才会进行冲突检测。当两个事务同时更新同一行数据,即并发事务存在冲突时,不同时间点的执行结果如下: - -![并发事务冲突流程](/media/best-practices/optimistic-transaction-table1.png) - -根据乐观锁检测写写冲突的设定,该实例的执行逻辑分析如下: - -![并发事务冲突逻辑](/media/best-practices/optimistic-transaction-case1.png) - -1. 如上图,事务 A 在时间点 `t1` 开始,事务 B 在 `t2` 开始。 - -2. 事务 A、事务 B 同时更新同一行数据。 - -3. `t4` 时,事务 A 更新 `id = 1` 的同一行数据。 虽然 `t3` 时,事务 B 已经更新了这一行数据,但是乐观事务只有在事务 commit 时才检测冲突,因此 `t4` 的操作执行成功了。 - -4. `t5` 时,事务 B 成功提交,数据落盘。 - -5. `t6` 时,事务 A 尝试提交,检测冲突时发现 `t1` 之后有新的数据写入,因此返回错误,提示客户端重试,事务 A 提交失败。 - -### 重试机制 - -TiDB 中默认使用乐观事务模型,因而在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,对应到上面的实例中,事务 A 在 `t4` 时就会返回错误,提示客户端根据需求去重试。 - -换言之,MySQL 在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。由于 TiDB 使用乐观锁机制造成了两边行为不一致,要兼容 MySQL 的悲观事务行为,需要在客户端修改大量的代码。为了便于广大 MySQL 用户使用,TiDB 提供了重试机制。当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry` 和 `tidb_retry_limit` 开启自动重试: - -```toml -# 用于设置是否禁用自动重试,默认不重试。 -tidb_disable_txn_auto_retry = on -# 用来控制重试次数。只有自动重试启用时该参数才会生效。 -# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 -tidb_retry_limit = 10 -``` - -推荐通过以下两种方式进行参数设置: - -1. Session 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@tidb_disable_txn_auto_retry = off; - set @@tidb_retry_limit = 10; - ``` - -2. Global 级别设置: - - {{< copyable "sql" >}} - - ```sql - set @@global.tidb_disable_txn_auto_retry = off; - set @@global.tidb_retry_limit = 10; - ``` - -### 重试的局限性 - -基于重试机制的原理,可将重试过程概括为以下三个步骤: - -1. 重新获取 `start_ts`。 - -2. 重新执行包含写操作的 SQL 语句。 - -3. 两阶段提交。 - -根据第二步,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。这会引发以下问题: - -1. `start_ts` 发生了变更。当前事务中,读到数据的时间与事务真正开始的时间发生了变化。同理,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。 - -2. 当前事务中,如果存在依赖查询结果来更新的语句,结果将变得不可控。 - -以下实例来具体说明了重试的局限性。开启自动重试后,当同时更新同一行数据时,Session A 和 Session B 在不同时间点的执行结果如下: - -![自动重试流程](/media/best-practices/optimistic-transaction-table2.png) - -该实例的执行逻辑分析如下: - -![自动重试逻辑](/media/best-practices/optimistic-transaction-case2.png) - -1. 如图,Session B 在 `t2` 时开始事务 2,`t5` 时提交成功。Session A 的事务 1 在事务 2 之前开始,在事务 2 提交完成后提交。 - -2. 事务 1、事务 2 同时更新同一行数据。 - -3. Session A 提交事务 1 时发现冲突,TiDB 内部重试事务 1。 - 1. 重新取得新的 `start_ts` 为 `t8’`。 - 2. 重新执行更新语句 `update tidb set name='pd' where id =1 and status=1`。 - 1. 发现当前版本 `t8’` 下并不存在符合条件的语句,不需要更新。 - 2. 没有数据更新,返回上层成功。 - -4. TiDB 认为事务 1 重试成功,返回客户端成功。 - -5. Session A 认为事务执行成功。如果在不存在其他更新,此时查询结果会发现数据与预想的不一致。 - -由上述分析可知,对于重试事务,当事务中更新语句需要依赖查询结果时,会重新取版本号作为 `start_ts`,所以无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 - -因此,如果存在依赖查询结果来更新 SQL 语句的事务,建议不要打开 TiDB 乐观锁的重试机制。 - -### 冲突预检 - -由上文可以知道,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 - -作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: - -* TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 -* TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 - -其中 TiDB 层的冲突检测可以选择关闭,具体配置项如下: - -```toml -# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 -[txn-local-latches] -# 是否开启内存锁,默认为关闭。 -enabled = false -# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 -# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), -# 设置过小会导致变慢,性能下降。(默认为 2048000) -capacity = 2048000 -``` - -配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: - -* `capacity` 值越小,占用内存小,误判概率越大。 -* `capacity` 值越大,占用内存大,误判概率越小。 - -实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 - -相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: - -```toml -# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 -# 每个 Key hash 到不同的 slot。(默认为 2048000) -scheduler-concurrency = 2048000 -``` - -此外,TiKV 支持监控等待 latch 的时间: - -![Scheduler latch wait duration](/media/best-practices/optimistic-transaction-metric.png) - -当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 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..2dbd0f51f787 100644 --- a/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md +++ b/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md @@ -312,7 +312,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 默认值:10 -这个变量用来设置最多可重试次数,即在一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。 +这个变量用来设置最大重试次数。一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,会根据该变量的设置进行重试。注意当 `tidb_retry_limit = 0` 时,也会禁用自动重试。 ### tidb_disable_txn_auto_retry @@ -326,7 +326,7 @@ set @@global.tidb_distsql_scan_concurrency = 10; 这个变量不会影响自动提交的隐式事务和 TiDB 内部执行的事务,它们依旧会根据 `tidb_retry_limit` 的值来决定最大重试次数。 -是否需要禁用自动重试,请参考[事务自动重试及带来的异常](/v3.1/reference/transactions/transaction-isolation.md#事务自动重试及带来的异常)。 +是否需要禁用自动重试,请参考[重试的局限性](/v3.1/reference/transactions/transaction-optimistic.md#重试的局限性)。 ### tidb_backoff_weight diff --git a/v3.1/reference/mysql-compatibility.md b/v3.1/reference/mysql-compatibility.md index f398c4b2e9b9..acaf0dd61eba 100644 --- a/v3.1/reference/mysql-compatibility.md +++ b/v3.1/reference/mysql-compatibility.md @@ -13,7 +13,7 @@ TiDB 支持 MySQL 传输协议及其绝大多数的语法。这意味着您现 > **注意:** > -> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v3.1/reference/security/compatibility.md)及[事务模型](/v3.1/reference/transactions/transaction-model.md)的兼容信息请查看各自具体页面。 +> 本页内容仅涉及 MySQL 与 TiDB 的总体差异。关于[安全特性](/v3.1/reference/security/compatibility.md)、[悲观事务模型](/v3.1/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)的兼容信息请查看各自具体页面。 ## 不支持的特性 diff --git a/v3.1/reference/sql/statements/load-data.md b/v3.1/reference/sql/statements/load-data.md index 9cadfe59cb85..69667d91515d 100644 --- a/v3.1/reference/sql/statements/load-data.md +++ b/v3.1/reference/sql/statements/load-data.md @@ -59,4 +59,4 @@ Records: 815264 Deleted: 0 Skipped: 0 Warnings: 0 ## 另请参阅 * [INSERT](/v3.1/reference/sql/statements/insert.md) -* [Transaction Model](/v3.1/reference/transactions/transaction-model.md) +* [乐观事务模型](/v3.1/reference/transactions/transaction-optimistic.md) diff --git a/v3.1/reference/sql/statements/select.md b/v3.1/reference/sql/statements/select.md index 51e3e0f09002..e29649208502 100644 --- a/v3.1/reference/sql/statements/select.md +++ b/v3.1/reference/sql/statements/select.md @@ -74,7 +74,7 @@ category: reference |`HAVING where_condition` | Having 子句与 Where 子句作用类似,Having 子句可以让过滤 GroupBy 后的各种数据,Where 子句用于在聚合前过滤记录。| |`ORDER BY` | OrderBy 子句用于指定结果排序顺序,可以按照列、表达式或者是 `select_expr` 列表中某个位置的字段进行排序。| |`LIMIT` | Limit 子句用于限制结果条数。Limit 接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是 0),第二个参数指定返回数据的最大条目数。| -|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。TiDB 使用[乐观事务模型](/v3.1/reference/transactions/transaction-model.md#事务模型)在语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 UPDATE、DELETE 和 SELECT FOR UPDATE。在事务的提交阶段 SELECT FOR UPDATE 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 SELECT FOR UPDATE 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。| +|`FOR UPDATE` | 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。使用[乐观事务模型](/v3.1/reference/transactions/transaction-optimistic.md)时,语句执行期间不会检测锁,因此,不会像 PostgreSQL 之类的数据库一样,在当前事务结束前阻止其他事务执行 `UPDATE`、`DELETE` 和 `SELECT FOR UPDATE`。在事务的提交阶段 `SELECT FOR UPDATE` 读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含 `SELECT FOR UPDATE` 语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。若使用悲观事务,则行为与其他数据库基本相同,不一致之处参考[和 MySQL InnoDB 的差异](/v3.1/reference/transactions/transaction-pessimistic.md#和-mysql-innodb-的差异)。 | |`LOCK IN SHARE MODE` | TiDB 出于兼容性解析这个语法,但是不做任何处理| ## 示例 diff --git a/v3.1/reference/transactions/overview.md b/v3.1/reference/transactions/overview.md index 4487f3f817db..a3775339ba58 100644 --- a/v3.1/reference/transactions/overview.md +++ b/v3.1/reference/transactions/overview.md @@ -1,15 +1,16 @@ --- title: TiDB 事务概览 +summary: 了解 TiDB 中的事务。 category: reference --- # TiDB 事务概览 -TiDB 支持完整的分布式事务。本文主要介绍涉及到事务的语句、显式/隐式事务以及事务的隔离级别和惰性检查。 +TiDB 支持完整的分布式事务,提供[乐观事务](/v3.1/reference/transactions/transaction-optimistic.md)与[悲观事务](/v3.1/reference/transactions/transaction-pessimistic.md)(TiDB 3.0 中引入)两种事务模型。本文主要介绍涉及到事务的语句、显式/隐式事务、事务的隔离级别和惰性检查,以及事务大小的限制。 -常用的变量包括 `autocommit`、[`tidb_disable_txn_auto_retry`](/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 +常用的变量包括 [`autocommit`](#自动提交)、[`tidb_disable_txn_auto_retry`](/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_disable_txn_auto_retry) 以及 [`tidb_retry_limit`](/v3.1/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_retry_limit)。 -## 事务常用语句 +## 常用事务语句 ### `BEGIN` 和 `START TRANSACTION` @@ -69,13 +70,11 @@ ROLLBACK; SET autocommit = {0 | 1} ``` -当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态。设置 `autocommit = 0` 时将更改当前 Session 为非自动提交状态。 - -自动提交状态下,每条语句运行后,TiDB 会自动将修改提交到数据库中。非自动提交状态下,通过执行 `COMMIT` 语句来手动提交事务。 +当 `autocommit = 1` 时(默认),当前的 Session 为自动提交状态,即每条语句运行后,TiDB 会自动将修改提交到数据库中。设置 `autocommit = 0` 时更改当前 Session 更改为非自动提交状态,通过执行 `COMMIT` 语句来手动提交事务。 > **注意:** > -> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句的时候,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 +> 某些语句执行后会导致隐式提交。例如,执行 `[BEGIN|START TRANCATION]` 语句时,TiDB 会试图提交上一个事务,并开启一个新的事务。详情参见 [implicit commit](https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 另外,`autocommit` 也是一个系统变量,你可以通过变量赋值语句修改当前 Session 或 Global 的值。 @@ -93,7 +92,7 @@ SET @@GLOBAL.autocommit = {0 | 1}; ## 显式事务和隐式事务 -TiDB 可以显式地使用事务 (`[BEGIN|START TRANSACTION]`/`COMMIT`) 或者隐式地使用事务 (`SET autocommit = 1`)。 +TiDB 可以显式地使用事务(通过 `[BEGIN|START TRANSACTION]`/`COMMIT` 语句定义事务的开始和结束) 或者隐式地使用事务 (`SET autocommit = 1`)。 在自动提交状态下,使用 `[BEGIN|START TRANSACTION]` 语句会显式地开启一个事务,同时也会禁用自动提交,使隐式事务变成显式事务。直到执行 `COMMIT` 或 `ROLLBACK` 语句时才会恢复到此前默认的自动提交状态。 @@ -109,7 +108,7 @@ TiDB **只支持** `SNAPSHOT ISOLATION`,可以通过下面的语句将当前 S SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` -## 事务的惰性检查 +## 惰性检查 TiDB 中,对于普通的 `INSERT` 语句写入的值,会进行惰性检查。惰性检查的含义是,不在 `INSERT` 语句执行时进行唯一约束的检查,而在事务提交时进行唯一约束的检查。 @@ -159,4 +158,57 @@ insert into test values (3); rollback; ``` -以上例子中,第二条语句执行失败。由于调用了 `rollback`,因此事务不会将任何数据写入数据库。 +以上例子中,第二条语句执行失败。由于调用了 `ROLLBACK`,因此事务不会将任何数据写入数据库。 + +## 事务大小 + +对于 TiDB 事务而言,事务太大或太小,都会影响事务的执行效率。 + +### 小事务 + +以如下 query 为例,当 `autocommit = 1` 时,下面三条语句各为一个事务: + +{{< copyable "sql" >}} + +```sql +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +``` + +此时每一条语句都需要经过两阶段提交,频繁的网络交互致使延迟率高。为提升事务执行效率,可以选择使用显式事务,即在一个事务内执行三条语句。 + +优化后版本: + +{{< copyable "sql" >}} + +```sql +START TRANSACTION; +UPDATE my_table SET a ='new_value' WHERE id = 1; +UPDATE my_table SET a ='newer_value' WHERE id = 2; +UPDATE my_table SET a ='newest_value' WHERE id = 3; +COMMIT; +``` + +同理,执行 `INSERT` 语句时,建议使用显式事务。 + +> **注意:** +> +> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 + +### 大事务 + +由于 TiDB 两阶段提交的要求,修改数据的单个事务过大时会存在以下问题: + +* 客户端在提交之前,数据都写在内存中,而数据量过多时易导致 OOM (Out of Memory) 错误。 +* 在第一阶段写入数据耗时增加,与其他事务出现写冲突的概率会指数级增长。 +* 最终导致事务完成提交的耗时增加。 + +因此,TiDB 对事务做了一些限制: + +* 单个事务包含的 SQL 语句不超过 5000 条(默认) +* 每个键值对不超过 6 MB +* 键值对的总数不超过 300000 +* 键值对的总大小不超过 100 MB + +为了使性能达到最优,建议每 100~500 行写入一个事务。 \ No newline at end of file diff --git a/v3.1/reference/transactions/transaction-isolation.md b/v3.1/reference/transactions/transaction-isolation.md index 69a0fc863579..4530591f1eb4 100644 --- a/v3.1/reference/transactions/transaction-isolation.md +++ b/v3.1/reference/transactions/transaction-isolation.md @@ -1,13 +1,14 @@ --- title: TiDB 事务隔离级别 +summary: 了解 TiDB 事务的隔离级别。 category: reference --- # TiDB 事务隔离级别 -事务隔离级别是数据库事务处理的基础,ACID 中 I,即 Isolation,指的就是事务的隔离性。 +事务隔离级别是数据库事务处理的基础,[ACID](/v3.1/glossary.md#acid) 中的 “I”,即 Isolation,指的就是事务的隔离性。 -SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重复读、串行化。详见下表: +SQL-92 标准定义了 4 种隔离级别:读未提交 (READ UNCOMMITTED)、读已提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。详见下表: | Isolation Level | Dirty Write | Dirty Read | Fuzzy Read | Phantom | | ---------------- | ------------ | ------------ | ------------ | ------------ | @@ -16,13 +17,11 @@ SQL 92 标准定义了 4 种隔离级别:读未提交、读已提交、可重 | REPEATABLE READ | Not Possible | Not possible | Not possible | Possible | | SERIALIZABLE | Not Possible | Not possible | Not possible | Not possible | -TiDB 实现了快照隔离 (Snapshot Isolation) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 +TiDB 实现了快照隔离 (Snapshot Isolation, SI) 级别的一致性。为与 MySQL 保持一致,又称其为“可重复读”。该隔离级别不同于 [ANSI 可重复读隔离级别](#与-ansi-可重复读隔离级别的区别)和 [MySQL 可重复读隔离级别](#与-mysql-可重复读隔离级别的区别)。 > **注意:** > -> 在 TiDB v3.0 的默认设置中,事务的自动重试功能已经关闭。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务自动重试及带来的异常](#事务自动重试及带来的异常)。 - -TiDB 使用 [Percolator 事务模型](https://research.google.com/pubs/pub36726.html),当事务启动时会获取全局读时间戳,事务提交时也会获取全局提交时间戳,并以此确定事务的执行顺序,如果想了解 TiDB 事务模型的实现可以详细阅读以下两篇文章:[TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/),[Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/)。 +> 在 TiDB v3.0 中,事务的自动重试功能默认为禁用状态。关于该项功能对隔离级别的影响以及如何开启该项功能,请参考[事务重试](/v3.1/reference/transactions/transaction-optimistic.md#重试机制)。 ## 可重复读 @@ -45,56 +44,12 @@ commit; | ### 与 ANSI 可重复读隔离级别的区别 -尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的 Snapshot 隔离级别 (SI)。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 +尽管名称是可重复读隔离级别,但是 TiDB 中可重复读隔离级别和 ANSI 可重复隔离级别是不同的。按照 [A Critique of ANSI SQL Isolation Levels](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-95-51.pdf) 论文中的标准,TiDB 实现的是论文中的快照隔离级别。该隔离级别不会出现狭义上的幻读 (A3),但不会阻止广义上的幻读 (P3),同时,SI 还会出现写偏斜,而 ANSI 可重复读隔离级别不会出现写偏斜,会出现幻读。 ### 与 MySQL 可重复读隔离级别的区别 -MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非 Snapshot 隔离级别,MySQL 可重复读隔离级别的一致性要弱于 Snapshot 隔离级别,也弱于 TiDB 的可重复读隔离级别。 - -## 事务自动重试及带来的异常 - -TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏快照隔离。如果业务可以容忍事务重试导致的异常,或并不关注事务是否以快照隔离级别来执行,则可以开启自动重试。通过设置 `tidb_disable_txn_auto_retry = off` 可开启该项功能。需注意 `tidb_retry_limit` 的值不能为 `0`,否则会禁用自动重试。开启自动重试以后,事务遇到提交出错的可能性会降低。 - -开启自动重试后,显式事务遇到冲突可能会导致最终结果不符合预期。 - -比如下面这两个例子: - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `select balance from t where id = 1;` | `update t set balance = balance -100 where id = 1;` | -| | `update t set balance = balance -100 where id = 2;` | -| // 使用 select 的结果决定后续的逻辑 | `commit;` | -| `if balance > 100 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -| Session1 | Session2 | -| ---------------- | ------------ | -| `begin;` | `begin;` | -| `update t set balance = balance - 100 where id = 1;` | `delete from t where id = 1;` | -| | `commit;` | -| // 使用 affected_rows 的结果决定后续的逻辑 | | -| `if affected_rows > 0 {` | | -| `update t set balance = balance + 100 where id = 2;` | | -| `}` | | -| `commit;` // 自动重试 | | - -因为 TiDB 自动重试机制会把事务第一次执行的所有语句重新执行一遍,当一个事务里的后续语句是否执行取决于前面语句执行结果的时候,自动重试会违反快照隔离,导致更新丢失。这种情况下,需要在应用层重试整个事务。 - -通过配置 `tidb_disable_txn_auto_retry = on` 变量可以关掉显示事务的重试。 - -{{< copyable "sql" >}} - -```sql -SET GLOBAL tidb_disable_txn_auto_retry = on; -``` - -改变 `tidb_disable_txn_auto_retry` 变量不会影响 `autocommit = 1` 的单语句的隐式事务,因为该语句的自动重试,不会造成丢失更新等异常,即不会破坏事务的隔离性。 - -关掉显式事务重试后,如果出现事务冲突,commit 语句会返回错误,错误信息会包含 `try again later` 这个字符串,应用层可以用来判断遇到的错误是否是可以重试的。 +MySQL 可重复读隔离级别在更新时并不检验当前版本是否可见,也就是说,即使该行在事务启动后被更新过,同样可以继续更新。这种情况在 TiDB 会导致事务回滚,导致事务最终失败,而 MySQL 是可以更新成功的。MySQL 的可重复读隔离级别并非快照隔离级别,MySQL 可重复读隔离级别的一致性要弱于快照隔离级别,也弱于 TiDB 的可重复读隔离级别。 -如果事务执行过程中包含了应用层的逻辑,建议在应用层添加显式事务的重试,并关闭自动重试。 +## 更多阅读 -`tidb_retry_limit` 变量决定了事务重试的最大次数,默认值为 10,当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。当用户相比于事务隔离性,更关心事务执行的延迟时,可以将它设置为 0,所有冲突的事务都会以最快的方式上报失败给应用层。 +- [TiKV 的 MVCC (Multi-Version Concurrency Control) 机制](https://pingcap.com/blog-cn/mvcc-in-tikv/) \ No newline at end of file diff --git a/v3.1/reference/transactions/transaction-model.md b/v3.1/reference/transactions/transaction-model.md deleted file mode 100644 index 5b72a91d5718..000000000000 --- a/v3.1/reference/transactions/transaction-model.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: 事务模型 -category: reference ---- - -# 事务模型 - -TiDB 默认使用乐观事务模型。也就是说,在执行 `UPDATE`、`INSERT`、`DELETE` 等语句时,只有在提交过程中才会检查写写冲突,而不是像 MySQL 一样使用行锁来避免写写冲突。类似的,诸如 `GET_LOCK()` 和 `RELEASE_LOCK()` 等函数以及 `SELECT .. FOR UPDATE` 之类的语句在 TiDB 和 MySQL 中的执行方式并不相同。所以业务端在执行 SQL 语句后,需要注意检查 `COMMIT` 的返回值,即使执行时没有出错,`COMMIT` 的时候也可能会出错。 - -## 事务限制 - -由于 TiDB 分布式两阶段提交的要求,修改数据的大事务可能会出现一些问题。因此,TiDB 特意对事务大小设置了一些限制以减少这种影响: - -* 单个事务包含的 SQL 语句不超过 5000 条(默认) -* 每个键值对不超过 6MB -* 键值对的总大小不超过 100MB - -## 基于事务模型的优化实践 - -由于 TiDB 中的每个事务都需要跟 PD leader 进行两次 round trip,TiDB 中的事务相比于 MySQL 中的事务延迟更高。以如下的 query 为例,用显式事务代替 `autocommit`,可优化该 query 的性能。 - -使用 `autocommit` 的原始版本: - -{{< copyable "sql" >}} - -```sql -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -``` - -优化后的版本: - -{{< copyable "sql" >}} - -```sql -START TRANSACTION; -UPDATE my_table SET a='new_value' WHERE id = 1; -UPDATE my_table SET a='newer_value' WHERE id = 2; -UPDATE my_table SET a='newest_value' WHERE id = 3; -COMMIT; -``` - -> **注意:** -> -> 由于 TiDB 中的资源是分布式的,TiDB 中单线程 workload 可能不会很好地利用分布式资源,因此性能相比于单实例部署的 MySQL 较低。这与 TiDB 中的事务延迟较高的情況类似。 diff --git a/v3.1/reference/transactions/transaction-optimistic.md b/v3.1/reference/transactions/transaction-optimistic.md new file mode 100644 index 000000000000..d84194c481ce --- /dev/null +++ b/v3.1/reference/transactions/transaction-optimistic.md @@ -0,0 +1,178 @@ +--- +title: TiDB 乐观事务模型 +summary: 了解 TiDB 的乐观事务模型。 +category: reference +aliases: ['/docs-cn/v3.1/reference/transactions/transaction-model/'] +--- + +# TiDB 乐观事务模型 + +本文介绍 TiDB 乐观事务的原理,以及相关特性。本文假定你对 [TiDB 的整体架构](/v3.1/architecture.md#tidb-整体架构)、[Percolator](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Peng.pdf) 事务模型以及事务的 [ACID 特性](/v3.1/glossary.md#acid)都有一定了解。 + +TiDB 默认使用乐观事务模型,不会出现读写冲突,所有的读操作都不会被写操作阻塞。对于写写冲突,只有在客户端执行 `COMMIT` 时,才会触发两阶段提交并检测是否存在写写冲突。 + +> **注意:** +> +> 自 v3.0.8 开始,TiDB 默认使用[悲观事务模型](/v3.1/reference/transactions/transaction-pessimistic.md)。但如果从 3.0.7 及之前的版本升级到 >= 3.0.8 的版本,不会改变默认事务模型,即**只有新创建的集群才会默认使用悲观事务模型**。 + +## 乐观事务原理 + +TiDB 中事务使用两阶段提交,流程如下: + +![TiDB 中的两阶段提交](/media/2pc-in-tidb.png) + +1. 客户端开始一个事务。 + + TiDB 从 PD 获取一个全局唯一递增的版本号作为当前事务的开始版本号,这里定义为该事务的 `start_ts` 版本。 + +2. 客户端发起读请求。 + + 1. TiDB 从 PD 获取数据路由信息,即数据具体存在哪个 TiKV 节点上。 + 2. TiDB 从 TiKV 获取 `start_ts` 版本下对应的数据信息。 + +3. 客户端发起写请求。 + + TiDB 校验写入数据是否符合一致性约束(如数据类型是否正确、是否符合唯一索引约束等)。**校验通过的数据将存放在内存里。** + +4. 客户端发起 commit。 + +5. TiDB 开始两阶段提交,保证分布式事务的原子性,让数据真正落盘。 + + 1. TiDB 从当前要写入的数据中选择一个 Key 作为当前事务的 Primary Key。 + 2. TiDB 从 PD 获取所有数据的写入路由信息,并将所有的 Key 按照所有的路由进行分类。 + 3. TiDB 并发地向所有涉及的 TiKV 发起 prewrite 请求。TiKV 收到 prewrite 数据后,检查数据版本信息是否存在冲突或已过期。符合条件的数据会被加锁。 + 4. TiDB 收到所有 prewrite 响应且所有 prewrite 都成功。 + 5. TiDB 向 PD 获取第二个全局唯一递增版本号,定义为本次事务的 `commit_ts`。 + 6. TiDB 向 Primary Key 所在 TiKV 发起第二阶段提交。TiKV 收到 commit 操作后,检查数据合法性,清理 prewrite 阶段留下的锁。 + 7. TiDB 收到两阶段提交成功的信息。 + +6. TiDB 向客户端返回事务提交成功的信息。 + +7. TiDB 异步清理本次事务遗留的锁信息。 + +## 优缺点分析 + +通过分析 TiDB 中事务的处理流程,可以发现 TiDB 事务有如下优点: + +* 实现原理简单,易于理解。 +* 基于单实例事务实现了跨节点事务。 +* 锁管理实现了去中心化。 + +但 TiDB 事务也存在以下缺点: + +* 两阶段提交使网络交互增多。 +* 需要一个中心化的版本管理服务。 +* 事务数据量过大时易导致内存暴涨。 + +实际应用中,你可以[根据事务的大小进行针对性处理](/v3.1/reference/transactions/overview.md#事务大小),以提高事务的执行效率。 + +## 事务的重试 + +使用乐观事务模型时,在高冲突率的场景中,事务很容易提交失败。而 MySQL 内部使用的是悲观事务模型,在执行 SQL 语句的过程中进行冲突检测,所以提交时很难出现异常。为了兼容 MySQL 的悲观事务行为,TiDB 提供了重试机制。 + +### 重试机制 + +当事务提交后,如果发现冲突,TiDB 内部重新执行包含写操作的 SQL 语句。你可以通过设置 `tidb_disable_txn_auto_retry = off` 开启自动重试,并通过 `tidb_retry_limit` 设置重试次数: + +```sql +# 设置是否禁用自动重试,默认为 “on”,即不重试。 +tidb_disable_txn_auto_retry = off +# 控制重试次数,默认为 “10”。只有自动重试启用时该参数才会生效。 +# 当 “tidb_retry_limit= 0” 时,也会禁用自动重试。 +tidb_retry_limit = 10 +``` + +你也可以修改当前 Session 或 Global 的值: + +- Session 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@tidb_retry_limit = 10; + ``` + +- Global 级别设置: + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_disable_txn_auto_retry = off; + ``` + + {{< copyable "sql" >}} + + ```sql + set @@global.tidb_retry_limit = 10; + ``` + +> **注意:** +> +> `tidb_retry_limit` 变量决定了事务重试的最大次数。当它被设置为 0 时,所有事务都不会自动重试,包括自动提交的单语句隐式事务。这是彻底禁用 TiDB 中自动重试机制的方法。禁用自动重试后,所有冲突的事务都会以最快的方式上报失败信息 (`try again later`) 给应用层。 + +### 重试的局限性 + +TiDB 默认不进行事务重试,因为重试事务可能会导致更新丢失,从而破坏[可重复读的隔离级别](/v3.1/reference/transactions/transaction-isolation.md)。 + +事务重试的局限性与其原理有关。事务重试可概括为以下三个步骤: + +1. 重新获取 `start_ts`。 +2. 重新执行包含写操作的 SQL 语句。 +3. 再次进行两阶段提交。 + +第二步中,重试时仅重新执行包含写操作的 SQL 语句,并不涉及读操作的 SQL 语句。但是当前事务中读到数据的时间与事务真正开始的时间发生了变化,写入的版本变成了重试时获取的 `start_ts` 而非事务一开始时获取的 `start_ts`。因此,当事务中存在依赖查询结果来更新的语句时,重试将无法保证事务原本可重复读的隔离级别,最终可能导致结果与预期出现不一致。 + +如果业务可以容忍事务重试导致的异常,或并不关注事务是否以可重复读的隔离级别来执行,则可以开启自动重试。 + +## 冲突检测 + +乐观事务下,检测底层数据是否存在写写冲突是一个很重要的操作。具体而言,TiKV 在 prewrite 阶段就需要读取数据进行检测。为了优化这一块性能,TiDB 集群会在内存里面进行一次冲突预检测。 + +作为一个分布式系统,TiDB 在内存中的冲突检测主要在两个模块进行: + +- TiDB 层。如果发现 TiDB 实例本身就存在写写冲突,那么第一个写入发出后,后面的写入已经清楚地知道自己冲突了,无需再往下层 TiKV 发送请求去检测冲突。 +- TiKV 层。主要发生在 prewrite 阶段。因为 TiDB 集群是一个分布式系统,TiDB 实例本身无状态,实例之间无法感知到彼此的存在,也就无法确认自己的写入与别的 TiDB 实例是否存在冲突,所以会在 TiKV 这一层检测具体的数据是否有冲突。 + +其中 TiDB 层的冲突检测可以根据场景需要选择打开或关闭,具体配置项如下: + +```toml +# 事务内存锁相关配置,当本地事务冲突比较多时建议开启。 +[txn-local-latches] +# 是否开启内存锁,默认为 false,即不开启。 +enabled = false +# Hash 对应的 slot 数,会自动向上调整为 2 的指数倍。 +# 每个 slot 占 32 Bytes 内存。当写入数据的范围比较广时(如导数据), +# 设置过小会导致变慢,性能下降。(默认为 2048000) +capacity = 2048000 +``` + +配置项 `capacity` 主要影响到冲突判断的正确性。在实现冲突检测时,不可能把所有的 Key 都存到内存里,所以真正存下来的是每个 Key 的 Hash 值。有 Hash 算法就有碰撞也就是误判的概率,这里可以通过配置 `capacity` 来控制 Hash 取模的值: + +* `capacity` 值越小,占用内存小,误判概率越大。 +* `capacity` 值越大,占用内存大,误判概率越小。 + +实际应用时,如果业务场景能够预判断写入不存在冲突(如导入数据操作),建议关闭冲突检测。 + +相应地,在 TiKV 层检测内存中是否存在冲突也有类似的机制。不同的是,TiKV 层的检测会更严格且不允许关闭,仅支持对 Hash 取模值进行配置: + +```toml +# scheduler 内置一个内存锁机制,防止同时对一个 Key 进行操作。 +# 每个 Key hash 到不同的 slot。(默认为 2048000) +scheduler-concurrency = 2048000 +``` + +此外,TiKV 支持监控等待 latch 的时间: + +![Scheduler latch wait duration](/media/optimistic-transaction-metric.png) + +当 `Scheduler latch wait duration` 的值特别高时,说明大量时间消耗在等待锁的请求上。如果不存在底层写入慢的问题,基本上可以判断该段时间内冲突比较多。 + +## 更多阅读 + +- [Percolator 和 TiDB 事务算法](https://pingcap.com/blog-cn/percolator-and-txn/) \ No newline at end of file diff --git a/v3.1/reference/transactions/transaction-pessimistic.md b/v3.1/reference/transactions/transaction-pessimistic.md index dcba48a52a52..2bebc1a600e7 100644 --- a/v3.1/reference/transactions/transaction-pessimistic.md +++ b/v3.1/reference/transactions/transaction-pessimistic.md @@ -1,12 +1,12 @@ --- -title: TiDB 悲观事务模式 +title: TiDB 悲观事务模型 +summary: 了解 TiDB 的悲观事务模型。 category: reference --- -# TiDB 悲观事务模式 +# TiDB 悲观事务模型 -TiDB 默认使用乐观事务模式,存在事务提交时因为冲突而失败的问题。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。 -悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 +TiDB 的乐观事务模型会导致事务提交时因为冲突而失败。为了保证事务的成功率,需要修改应用程序,加上重试的逻辑。悲观事务模式可以避免这个问题,应用程序无需添加重试逻辑,就可以正常执行。 ## 悲观事务模式的行为