我看到这么一句话:“乐观锁直到你准备提交所作的更改时才将对象锁住,当你读取以及改变该对象时并不加锁”后半句怎么理解,特别是它说的更改该对象是不加锁???假设有一个事务 ,,在事务中有一个update语句,,加锁的时候发生在update这个语句执行时候??还是在这个事务commit的时候??

解决方案 »

  1.   

    执行UPDATE语句的时候,就在受影响的记录上加排他锁,并同时在表上加共享锁。commit时取消锁定。
      

  2.   

    加了排它锁,,是不是就不允许读了 !!
    但是select for update 的锁和UPDATE 是一样的,,为什么select for update 锁后允许读
      

  3.   

    加了排它锁是指不允许其他人修改了,不是不允许读!
    其实select for update 就是加的悲观锁。你在执行这句话后其实并没有真正修改数据,但数据已经被你加锁,其他人就不允许修改了。
    不管加什么锁, oracle都允许读。注意的是在你修改数据并未提交前,读的是未修改的数据。
      

  4.   

    为什么select for update 锁后允许读?
    这是有条件的允许读。只允许读取那些未被锁定的行,即未落在for update 的where条件范围内的记录行。这是可重复读隔离级别的典型表现。
      

  5.   

    我理解是,for update  和update 一样是获取排他锁;;;排他锁是独占锁,但是在oracle中才用是多版本,所以可以读
      

  6.   

    个人认为,1楼5楼正解,
    由于oracle的多版本性,只存在写阻塞写的问题