表在被session1 select时,同时其数据被另一session2访问并进行DML更新时.这2个session分别从哪里获取数据?session1最终显示的是什么?怎么解释?
- 这个问题的点是:Oracle多版本与并发的问题,这里也正是Oracle与其他数据库的区别点之一.分2种情况介绍,session1的查询返回在2个select语句中,和在1个select语句中.
- 根据Oracle默认的事务隔离级别为read committed,此时会产生不可重复读或幻影读,当session1在读取表t1记录r1过程中,session2有表t1记录r1的增,删,改的DML操作,只要session2有提交,当session1再次读取表t1的记录r1时都会在该session获取最新的数据,否则不会显示最新.此时,session1中的数据来自刚刚修改过的最新data buffer或者data buffer没有了则来自被更新过的最新的data file.
- 另外,当session1进行的是一个很长的select查询,当查询开始读取r1后,session2对该表的最后一行r10000000进行了修改,并进行了提交,但当session1显示到r10000000记录时,虽然session2已经提交,但返回的还是r10000000修改之前的记录,保证数据在session1查询的那一刻一致.此时,session1的select查询数据会来自UNDO,并不是当前最新的已提交的数据.
完结