会话之间锁的有关问题
会话之间锁的问题
顺序执行:
会话1有个保存点1,然后update一行数据,没有commit;
会话2也update这行数据,开始等待;
会话1rollback to 保存点1,也就是说释放了这行数据的锁;
问题是,此时会话2仍在等待;而会话3在update 这行数据时,却执行成功。Why??
试了一下,会话1只有commit或rollback后会话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并没有在等待事务,可正常执行。
应该是这个样子的!
顺序执行:
会话1有个保存点1,然后update一行数据,没有commit;
会话2也update这行数据,开始等待;
会话1rollback to 保存点1,也就是说释放了这行数据的锁;
问题是,此时会话2仍在等待;而会话3在update 这行数据时,却执行成功。Why??
试了一下,会话1只有commit或rollback后会话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并没有在等待事务,可正常执行。
应该是这个样子的!