- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
吴雪莲-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,可配置。