匿名用户oracle会把未提交的数据写到数据文件中吗?
oracle会把未提交的数据写到数据文件中吗?
我来答
添加附件
收藏
复制链接
微信扫码分享
在小程序上查看
分享
添加附件
问题补充
5条回答
默认
最新
会写入数据文件的,做个简单测试可以说明这一点,如下:
# session 1,创建测试表,插入两条数据,并模拟一个未提交事务
create table test_mod (id number,name varchar2(20));
insert into test_mod values(1,'test');
insert into test_mod values(2,'test2');
commit;
update test_mod set name='czh' where id=1; --未提交
# session 2
-- 执行完全检查点以及flush buffer cache
alter system checkpoint;
alter system flush buffer_cache;
-- 查询上面构造测试表数据块
select
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) r_file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_number
from hr.test_mod;
OBJECT_ID R_FILE_ID BLOCK_ID ROW_NUMBER
--------- ---------------------------------------- ---------------------------------------- ----------------------------------------
113023 4 173227 0
113023 4 173227 1
# dump 内存以及数据文件对应块
# 由于执行了检查点以及flush buffer cache,所以下面两个dump出来trace文件内容基本相同。
SYS@honor1 > alter system dump datafile 4 block 173227;
SYS@honor1 > alter system dump datafile '+DATADG/honor/datafile/users.259.984507931' block 173227;
-- 下面节选部分关键内容
block_row_dump:
tab 0, row 0, @0x1f77
tl: 10 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 02
col 1: [ 3] 63 7a 68
tab 0, row 1, @0x1f81
tl: 12 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [ 5] 74 65 73 74 32
# 转换一下第一行的col 1,看看是数据文件中写的是多少值
SYS@honor1 > select utl_raw.cast_to_varchar2('637a68') from dual;
UTL_RAW.CAST_TO_VARCHAR2('637A68')
-------------------------------------
czh
--可以看到,update未提交的数值被写入了数据文件,而初始值test已被覆盖。
# 接下来rollback
rollback;
select * from test_mod;
ID NAME
---------------------------------------- ----------------------------------------
1 test
2 test2
--可以看到表中值回到了test。
通过上述测试,可以看到,未提交的值也是有可能写入数据文件。
评论
有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏

