注意:mysql中的默认值同样记录的是dml操作发出时的时间,并且没有找到mysql中准确记录commit时间的方法。
oracle中数据发生变动时,如何准确记录发生变动时的时间。一般会使用ts字段,该字段使用默认值,default to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) 进行记录。但是这种记录方式一般是BI数仓使用,基本都是串行insert和delete操作。因为是串行,所以认为ts近似于提交(commit)时间,而实际ts记录的是该操作(insert)发出的时间。
对于并发频繁insert、update,或者事务时间较长,如何精确记录提交时间。
ora_rowscn是oracle10g版本中提出的概念,是一个伪列,用来记录数据提交时的scn,而scn是唯一的,且scn的先后就是commit的时间的先后。默认建表方式的ora_rowscn记录的是scn是精确到block的,而不是row,此时ora_rowscn取自data block header中的scn。要精确到row,需要使用以下方式建表:create table tab(c1 number) rowdependencies,此时每行数据需要增加6字节的开销。
ora_rowscn到timestamp转换,函数scn_to_timestamp()
普通建表
create table ctest (c1 varchar2(10),ts varchar2(19) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
-- 2022-11-14 10:58 insert
-- 2022-11-14 11:00 commit
insert into ctest(c1) values ('c');
insert into ctest(c1) values ('y');
select c1,ts,to_char(scn_to_timestamp(ora_rowscn),'yyyy-mm-dd hh24:mi:ss') ts2 from ctest
仔细比对下图中内容
精确到行
create table ctest (c1 varchar2(10),ts varchar2(19) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')) rowdependencies
-- 2022-11-14 10:58 insert
-- 2022-11-14 11:00 commit
insert into ctest(c1) values ('c');
insert into ctest(c1) values ('y');
select c1,ts,to_char(scn_to_timestamp(ora_rowscn),'yyyy-mm-dd hh24:mi:ss') ts2 from ctest