Skip to content

Commit

Permalink
pessimistic trx: cleanup wording (#4446) (#4495)
Browse files Browse the repository at this point in the history
sre-bot@pingcap.com
  • Loading branch information
ti-srebot authored Sep 14, 2020
1 parent 71f78d7 commit 28d46bf
Showing 1 changed file with 7 additions and 11 deletions.
18 changes: 7 additions & 11 deletions pessimistic-transaction.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,24 +42,18 @@ BEGIN /*!90000 PESSIMISTIC */;

悲观事务的行为和 MySQL 基本一致(不一致之处详见[和 MySQL InnoDB 的差异](#和-mysql-innodb-的差异)):

- `SELECT FOR UPDATE` 会读取已提交的**最新**数据,并对读取到的数据加悲观锁
- `UPDATE``DELETE``INSERT` 语句都会读取已提交的**最新**数据来执行,并对所修改的行加悲观锁

- `UPDATE``DELETE``INSERT` 语句都会读取已提交的**最新**的数据来执行,并对修改的数据加悲观锁
- `SELECT FOR UPDATE` 语句会对已提交的**最新**的数据而非所修改的行加上悲观锁

- 当一行数据被加了悲观锁以后,其他尝试修改这一行的写事务会被阻塞,等待悲观锁的释放。
- 悲观锁会在事务提交或回滚时释放。其他尝试修改这一行的写事务会被阻塞,等待悲观锁的释放。其他尝试*读取*这一行的事务不会被阻塞,因为 TiDB 采用多版本并发控制机制 (MVCC)

- 当一行数据被加了悲观锁以后,其他尝试读取这一行的事务不会被阻塞,可以读到已提交的数据
- 如果多个事务尝试获取各自的锁,会出现死锁,并被检测器自动检测到。其中一个事务会被随机终止掉并返回兼容 MySQL 的错误码 `1213`

- 事务提交或回滚的时候,会释放所有的锁。

- 当有多个事务同时等待同一个锁释放时,会尽可能按照事务 start ts 顺序获取锁,但不能严格保证。

- 如果并发事务出现死锁,会被死锁检测器检测到,随机终止掉其中一个事务并返回兼容 MySQL 的错误码 `1213`
- 通过 `innodb_lock_wait_timeout` 变量,设置事务等锁的超时时间(默认值为 `50`,单位为秒)。等锁超时后返回兼容 MySQL 的错误码 `1205`。如果多个事务同时等待同一个锁释放,会大致按照事务 `start ts` 顺序获取锁。

- 乐观事务和悲观事务可以共存,事务可以任意指定使用乐观模式或悲观模式来执行。

- 通过设置 `innodb_lock_wait_timeout` 变量,设置等锁超时时间,等锁超时后返回兼容 MySQL 的错误码 `1205`

- 支持 `FOR UPDATE NOWAIT` 语法,遇到锁时不会阻塞等锁,而是返回兼容 MySQL 的错误码 `3572`

- 如果 `Point Get``Batch Point Get` 算子没有读到数据,依然会对给定的主键或者唯一键加锁,阻塞其他事务对相同主键唯一键加锁或者进行写入操作。
Expand Down Expand Up @@ -88,6 +82,8 @@ BEGIN /*!90000 PESSIMISTIC */;

6. 对语句中 `EMBEDDED SELECT` 读到的相关数据不会加锁。

7. 垃圾回收 (GC) 不会影响到正在执行的事务,但悲观事务的执行时间仍有上限,默认为 10 分钟,可通过 TiDB 配置文件 `[performance]` 类别下的 `max-txn-ttl` 修改。

## 隔离级别

TiDB 在悲观事务模式下支持了 2 种隔离级别:
Expand Down

0 comments on commit 28d46bf

Please sign in to comment.