【 TiDB 使用环境】生产环境
【 TiDB 版本】7.1
有个问题,如果一个datetime类型的字段设置为 Current_timestamp 那么时间源是来自哪里?
如果是一个事务中,这个取到的时间是事务开始时候还是commit时候
没看出来哪写的是开始时间
不知道有没有理解错,看着时间是在commit前的样子
事务开始时间啊,简单测试下就知道。
SET autocommit=0;
SELECT CURRENT_TIMESTAMP;
INSERT INTO t_time(id) VALUES(1);
#等待1分钟
SELECT CURRENT_TIMESTAMP;
COMMIT;
SELECT *FROM t_time;
应该是实际引用到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;
自然时间,来源于操作系统和硬件… 做好对时…
tiup安装一般都会要求对时的…
要知道是哪个时间 需要了解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 天后被自动关闭。不再允许新回复。