事务TTL作用

begin开启一个事务,进行dml操作,发现tidb log里面每隔10秒send TxnHeartBeat,并更新ttl。请教一个这个ttl怎么去理解? 为什么要10s刷新一次。

log :

[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=201800]
[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=211800]
[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=221801]
[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=231800]
[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=241801]
[INFO] [2pc.go:1163] ["send TxnHeartBeat"] [startTS=456497418059120642] [newTTL=251800]

Time to Live (TTL) 提供了行级别的生命周期控制策略。通过为表设置 TTL 属性,TiDB 可以周期性地自动检查并清理表中的过期数据。此功能在一些场景可以有效节省存储空间、提升性能。

TTL 常见的使用场景:

  • 定期删除验证码、短网址记录
  • 定期删除不需要的历史订单
  • 自动删除计算的中间结果

TTL 设计的目标是在不影响在线读写负载的前提下,帮助用户周期性且及时地清理不需要的数据。TTL 会以表为单位,并发地分发不同的任务到不同的 TiDB Server 节点上,进行并行删除处理。TTL 并不保证所有过期数据立即被删除,也就是说即使数据过期了,客户端仍然有可能在这之后的一段时间内读到过期的数据,直到其真正的被后台处理任务删除。

也可以参考官方文档理解一下。
https://docs.pingcap.com/zh/tidb/stable/time-to-live/#ttl-任务

相当于帮你定时清理表中不再需要的历史数据(过期数据),你在创建表的时候,建立一个保留策略,tidb会自动根据这个策略,帮你清理这些数据,大大减少了维护量。另一个角度来说,也保证数据库的性能、可用性、甚至健壮性。

send TxnHeartBeat更新是的事务中的adviselock锁的ttl时间。

https://docs.pingcap.com/zh/tidb/stable/dev-guide-timeouts-in-tidb/#事务超时

https://docs.pingcap.com/zh/tidb/stable/tidb-configuration-file/#max-txn-ttl

当 APP ”同时“ 发送 txn1 和 txn2 到 TiDB,txn1 和 txn2 之间存在锁冲突,TiDB 先执行了 txn1,则 txn2 需要等到 txn1 提交或回滚之后才能执行,TiDB 内部通过事务心跳机制来防止一些特殊情况下 txn1 持有锁的泄漏,进而防止 txn2 无限期等待。当 txn1 事务心跳超时后,txn2 即可 resolve txn1 持有的锁,之后当 txn1 恢复后会 rollback 并返回 error 报错给 APP。

设计这个机制的目的是上面这段,详细的测试可以看下面这个文章。

2 个赞

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。