hygame
(Hygame)
1
为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
tidb5.4 3tidb 3pd 3kv 3tiflash 混合部署
【概述】 场景 + 问题概述
创建了一个SEQUENCE: CREATE SEQUENCE sqeuence_user_id
start with 2000000000000 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 2 nocycle ENGINE=InnoDB
用mysql客户端连接的时候,获取序列的下一个值后,断开连接,重新连接后获取到的序列值有可能比上一次连接获取的序列值要小
使用navicat连接后,调用nextval函数获取序列的下一个值,多次调用结果不变

【应用框架及开发适配业务逻辑】
【背景】 做过哪些操作
【现象】 业务和数据库现象
【问题】 当前遇到的问题
【业务影响】
【TiDB 版本】
5.4
【附件】 相关日志及监控(https://metricstool.pingcap.com/)
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。
2 个赞
h5n1
(H5n1)
2
通过负载均衡连接到后端的tidb吧,每个tidb实例的分配范围不一样,再次连接的时候可能连到另一个tidb server
1 个赞
hygame
(Hygame)
3
是通过haproxy负载均衡的,连接到不同tidb server这个序列的值是有缓存可以理解,但是navicat取值为什么不变,而且值也不是正确的
1 个赞
h5n1
(H5n1)
4
mysql客户端方式没问题吧?不知道navicat里有啥特殊的,你说的值不正确是什么现象
1 个赞
hygame
(Hygame)
5
值不正常指的是mysql客户端显示当前序列值是2000000000178,而navicat中显示200000000017,且不变,现在需要一个全局单调递增的序列方案,您这边有没有什么好方法
hygame
(Hygame)
6
知道了,是navicat显示问题,比客户端少显示了一位
hygame
(Hygame)
7
刚才查了一下文档,
BEGIN;
SELECT @@tidb_current_ts;
ROLLBACK;
这样可以当做全局的自增序列来用吗
h5n1
(H5n1)
8
这代表事务开始的时间戳,整个事务期间一直是这个值,一个事务内获取多个值的话可能不太现实
hygame
(Hygame)
11
需要一个全局保持单调递增的序列或者计数器,允许跳跃,但是不能取到比之前小的值
h5n1
(H5n1)
12
tidb能全局递增的也就tso或者表的自增列,自增列的话可能有热点问题。 可以考虑使用tidb_current_ts; 然后程序内吧当前事务获得的ts值自增,或者使用外部的发号程序
1 个赞
system
(system)
关闭
14
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。