吴雪莲-TiDB 悲观锁

展开查看详情

1.TiDB 悲观锁 Presented by: shirly

2.自我介绍 ● 吴雪莲 ● TiKV 研发工程师 ● Transaction 和 Coprocessor 模块负责人 ● 曾就职于盛大创新院、京东云、网易杭州研究院,从事公有云 对象 存储系统的研发和设计。

3.Agenda ● 悲观锁要解决的问题 ● MySQL 悲观锁行为 ● TiDB 悲观事务 ● 等锁 ● 死锁 ● 测试 ● 使用

4.Part I - 悲观锁解决的问题

5.乐观事务

6.

7.

8.乐观事务 库 库 存 加购物 存 加购物 5 车3 5 车4 同时下单 下单 4 件,库 下单 3 件,库 存剩余 1 存剩余 2

9.悲观事务 库 库 存 存 5 5 加购物车 3,尝试 获取库存锁…… 加购物车 4, 发现锁住,等待 数据加锁成 功

10.乐观事务 VS 悲观事务 冲突检测的检测时间点: ● 乐观:加购物车成功 =》下单不一定成功 ● 悲观:加购物车成功 =》下单一定成功

11.乐观事务存在的问题 ● 提交不一定成功。 ● 冲突需要手动重试。 ● 冲突严重且重试代价大的场景性能差,失 败率高。 ● MySQL 用户习惯于悲观事务模型,应用侧一般不会重试。

12.悲观锁解决的问题 ● 通过支持悲观事务,降低用户修改代码的难度甚至不用修改代 码。 ● 拓展 TiDB 的应用场景。

13.Part II - MySQL 悲观锁行为

14.PostgreSQL Session A Session B > begin; > begin; > set transaction isolation level repeatable > set transaction isolation level repeatable read; read; > update test set value = value + 1 where id = 1; UPDATE 1 > update test set value = value + 1 where id = 1; block... > commit; ERROR: could not serialize access due to COMMIT concurrent update

15.MySQL Session A Session B > begin; > begin; > update test set value = value + 1 where id = 1; Query OK, 1 row affected > update test set value = value + 1 where id = 1; block... > commit; Query OK, 1 row affected Query OK, 0 rows affected > commit; Query OK, 0 rows affected

16.MySQL Session A Session B > create table t (i int); > begin; > select * from t; Empty set > insert into t values (1); Query OK, 1 row affected > select * from t for update; 1 row in set > select * from t; Empty set

17.MySQL 悲观锁行为 ● LOCKING READS、UPDATE 和 DELETE 基于锁。 ● 写写冲突不会 abort,基于锁的行为会读到最新已提交的数据。 ● 写写冲突不一定会 导致异常,写操作基于最新已提交的数据能避免大部分异常。

18.Part III - TiDB 悲观事务

19.实现上的考虑 ● 在现有实现基础上进行改造,减少改 动。 ● 兼容现有乐观事务模型,支持乐观、悲观混合使用。 ● 兼容 MySQL 行为。

20.乐观事务

21.初步想法

22.问题 ● 锁的存在会阻塞 读,悲观锁存在时间长。

23.为什么 TiDB 乐观事务中锁会阻塞读?

24.悲观事务的实现

25.Pessimistic Lock —— 遇到其他事务的锁 ●

26.Part III.I - 等锁

27.在哪里等锁? ● 若在 TiDB 实现,要定期重试,不及时且代价大。 ● 在 TiKV 中实现等锁,能够及时得知锁被释放。

28.Waiter Manager ● 当遇到锁时,会在 TiKV 中等锁。

29.Waiter Manager- time out ● 等锁有超时时间,默认为 3s,可配置。

StreamNative 是一家围绕 Apache Pulsar 和 Apache BookKeeper 打造下一代流数据平台的开源基础软件公司。秉承 Event Streaming 是大数据的未来基石、开源是基础软件的未来这两个理念,专注于开源生态和社区的构建,致力于前沿技术。