我有两个进程访问同一个表。每个都运行select for update查询并设置WAIT值。
我的问题是:如果进程1运行查询并锁定表中的n行,如果进程1在提交之前崩溃,那么如何释放行?
我尝试在sql developer中打开两个会话,并在第一个会话中运行select for update,然后关闭它。在第二个会话中RUn相同的查询,发现行仍然被锁定!
答案 0 :(得分:0)
只要交易持续*,交易持有的锁就会持续。释放它们的唯一方法是结束交易。
什么"崩溃"准确地说?在三层应用程序中,当前端失败时,中间层通常通过关闭关闭任何关联事务的逻辑会话来清理。在客户端 - 服务器应用程序中,如果锁的持有者没有正常关闭,Oracle可能不会立即意识到。 DBA通常会配置死连接检测,以定期向客户端发送ping以验证它们是否仍处于活动状态,以便数据库可以在几分钟后识别出死会话并将其回滚。如果数据库未配置为检测到问题且客户端/服务器应用程序未关闭事务,则可能需要等待一段时间。可能存在限制会话可以连接的时间的配置文件或者在一段时间后杀死会话的DBA脚本,或者您可能必须调用DBA并要求他们终止其他会话。
*
要迂腐,可以通过dbms_lock
获取用户定义的锁,这些锁持久存在于会话中而不是事务中。但这超出了这个问题的范围。