SAVEPOINT:创建保存点,用于事务的阶段回退 
由此可见,rollback 到保存点后,oracle会释放这个保存点以后的所有锁,也就是说保存点之后的所有等待事务可以执行了,但是保存点前的不行,所以,你的第二个会话仍然不行,但是你新建的第三个会话可以正常的执行

解决方案 »

  1.   

    同学,savepoint是事务里面的
    当以下情况发生时,事务结束:
    ·COMMIT/ROLLBACK
    ·执行了DDL/DCL语句
    ·用户主动断开数据库连接(EXIT)
    ·数据库服务器宕机
      

  2.   


    在回滚到一个savepoint后,Oracle释放由被回滚的语句持有的锁。其他等待之前被锁资源的事务可以进行了。其他要更新之前被锁行的事 务也可以执行。
    当一个事务回滚到一个savepoint,发生下列事件:
    1. Oracle仅回滚savepoint之后的语句。
    2. Oracle保留这一savepoint,但所有建立于此后的savepoints丢失。
    3. Oracle释放在该savepoint后获得的所有表、行锁,但保留之前获得的所有锁。
    事务保持活动并可继续。
    无论何时一个会话在等待事务,到savepoint的回滚不会释放行锁。为了确保事务如果无法获得锁也不会悬挂(hang),在执行UPDATE 或DELETE前使用FOR UPDATE … NOWAIT。(这里指回滚的savepoint之前获得的锁。该savepoint后获得的行锁会被释放,之后执行的语句也会被彻底回滚.因为你的会话2在等待事务,所以到保存点的回滚不会释放行锁。
    而你的会话3并没有在等待事务,可正常执行。
    应该是这个样子的!