日期:2014-05-17  浏览次数:20746 次

oracle10g procedure 事务update后commit前select,会脏读吗
oracle10g procedure 事务update后commit前select,会脏读吗?
比如:
开始table col1为789,procedure如下:
begin
update table set col1= '123'
select * from table (此时col1是123,还是789,为什么)
commit


------解决方案--------------------
你这个查询时在update的session里,因此读出来的是修改后的123,这不叫读脏。

但是在commit之前 别的session 看不到这个修改后的结果,查询出来的还是789(如果查询到的是123了那就叫读脏了)
------解决方案--------------------
update table set col1= '123' 
select col1 from table
此时去读就是123

然后你开启一个session,则用另一个session去读则是789,这个可以自已试下

你更新前的数据记录在undo区的,并不是直接更新到数据库,所以其他用户读不到你更新的这条记录的新值,他们读取的是789,但当你commit后,undo区的内容直接更新到表,此时你和其他用户看到的记录就都是更新后的了:123