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

解决方案 »

  1.   

    789如果你另开启一个会话,执行选择select * from table,则是123,条件是你不执行commit
      

  2.   

    你这个查询时在update的session里,因此读出来的是修改后的123,这不叫读脏。但是在commit之前 别的session 看不到这个修改后的结果,查询出来的还是789(如果查询到的是123了那就叫读脏了)
      

  3.   

    你的意思是同一个session里面读到的是修改后的数据?原理是什么?
      

  4.   

    没有理解,你的意思还是读到了是789,而不是update之后的值123?
      

  5.   

    update table set col1= '123' 
    select col1 from table
    此时去读就是123然后你开启一个session,则用另一个session去读则是789,这个可以自已试下你更新前的数据记录在undo区的,并不是直接更新到数据库,所以其他用户读不到你更新的这条记录的新值,他们读取的是789,但当你commit后,undo区的内容直接更新到表,此时你和其他用户看到的记录就都是更新后的了:123