Oracle11g_Read Commited模式下_为什么出现脏读DirtyRead

kaneiqi 2014-09-12 11:59:06
环境: Oracle 11g
工具: 自带的Oracle SQL Developer
表结构:
create table t(x int, y int); 
insert into t values(1,1); --初始值为x = 1
commit;

测试步骤:
step 1: 打开一个session(取名叫session A好了),开始一个transaction 1, 更新表 t :
alter session set isolation_level = read committed;
update t set x = x+1;
select * from t;-- x = 2

step 2: 打开另一个session B, 开始另一个transaction 2 更新同一个表 t :
alter session set isolation_level = read committed;
update t set x = x+1;--这里读到了transaction 1未提交的数据(x=2),然后执行x = x+1,得到x = 3
select * from t;--x = 3

step 3: 在session B 中
commit transaction B,得到x = 3;
commit;
select * from t;--x = 3

问题: 如step2所示,为什么在transaction 2可以读到transaction 1未提交的数据(x = 2)? 这不是脏读吗?

补充:刚又在serializable模式下试了一次,一样的情况!
...全文
211 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaneiqi 2014-09-12
  • 打赏
  • 举报
回复
找到原因了,step2中我打开的是一个“SQL工作表”,而非一个新的session B; 由于只是个新窗口,与session A 仍然用的是同一个连接,等于是在同一个transaction里; 解决:重新建个连接来做实验就正确了,结果与1楼@yidalts123一样 自己对Oracle SQL Developer使用不熟悉,分还是给1楼吧
bw555 2014-09-12
  • 打赏
  • 举报
回复
tool----perferences---options---confirm commit rollback
bw555 2014-09-12
  • 打赏
  • 举报
回复
SQL Developer 是不是自动提交了啊 ool----perferences---options---confirm commit rollback 打钩
RUMBLE_ZHENG 2014-09-12
  • 打赏
  • 举报
回复
怎么我试的结果和LZ不一样?如果会话A中update了表没有提交的话,我再去开会话B,select是查不到会话A中的变更的,而且我在会话B中update的话,会被阻塞而一直等待会话A,我返回A执行commit后,会话B的update才提示更新完成,此时A B都可以看到一致的结果。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧