oracle准确记录数据提交时间

注意: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值