关于tidb插入日期类型问题

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.1
有个问题,如果一个datetime类型的字段设置为 Current_timestamp 那么时间源是来自哪里?
如果是一个事务中,这个取到的时间是事务开始时候还是commit时候

之前有大佬基于TiDB General log记录测试,看着是开始的时候
链接: 多种方式告诉你如何计算DM同步数据到TiDB的延时时间

2 个赞

没看出来哪写的是开始时间

就这个tidb binlog呢

1 个赞

:joy: 不知道有没有理解错,看着时间是在commit前的样子

1 个赞

事务开始时间啊,简单测试下就知道。
SET autocommit=0;

SELECT CURRENT_TIMESTAMP;
INSERT INTO t_time(id) VALUES(1);

#等待1分钟

SELECT CURRENT_TIMESTAMP;

COMMIT;

SELECT *FROM t_time;

1 个赞

应该是实际引用到current_timestamp的时间。

begin;
SELECT CURRENT_TIMESTAMP;
select sleep(5);
INSERT INTO t_time(id) VALUES(1);
select sleep(5);
SELECT CURRENT_TIMESTAMP;
commit;
select * from t_time;

2 个赞

自然时间,来源于操作系统和硬件… 做好对时…

tiup安装一般都会要求对时的… :slightly_smiling_face:

要知道是哪个时间 需要了解Tidb Percolator 2PC 流程
Commit TS 采用了类似 HLC 的计算方法:
1.TiKV 本地存储了一个 max_ts,当 TiDB带着 start_ts 来访问 TiKV 时候,max_ts = max(max_ts, start_ts),max_ts 缓存了当前访问的最大 start_ts。–>
2.TiDB 缓存了当前事务的 min_commit_ts(初始化为 start_ts + 1),在 prewrite 时候传给 TiKV。
3.TiKV 在收到 prewrite 请求的时候会比较 prewrite.min_commit_ts 与 max_ts值,返回一个推高值 prewriteResp.MinCommitTs = max(prewrite.min_commit_ts, max_ts + 1)
4.TiDB 收到 prewrite 请求结果,更新 min_commit_ts = max(min_commit_ts ,prewriteResp.MinCommitTs)
最后的 min_commit_ts 将会作为事务的 Commit TS。

专栏 - TiDB 5.0 两阶段提交 | TiDB 社区 302课程 金牌讲师董菲讲得也很清楚喔

ts 和 CURRENT_TIMESTAMP是什么关系?

create table t_time(t datetime);
begin;
SELECT CURRENT_TIMESTAMP;
select sleep(5);
INSERT INTO t_time VALUES(CURRENT_TIMESTAMP);
select sleep(5);
INSERT INTO t_time VALUES(CURRENT_TIMESTAMP);
SELECT CURRENT_TIMESTAMP;
commit;
select * from t_time;

CURRENT_TIMESTAMP是语句执行的时候 获取的硬件时钟 TS是事务时间有一定内部算法 本质上应该也是获取硬件时钟

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