选择select for update会永久等待锁定行吗?

4
我有两个进程访问同一张表。每个进程都运行了一个带有WAIT值的select for update查询。我的问题是:如果进程一运行查询并锁定了表中的n行,那么如果进程一在提交之前崩溃,如何释放这些行?
我尝试在SQL Developer中打开两个会话,在第一个会话中运行select for update,然后关闭它。在第二个会话中运行相同的查询,并发现这些行仍然被锁定!
1个回答

2
事务持有的锁只要事务存在,就会一直存在。唯一释放它们的方法是结束该事务。
"崩溃"指什么?在三层应用程序中,当前端失败时,中间层通常通过关闭逻辑会话来清理,从而关闭所有关联的事务。在客户机/服务器应用程序中,如果锁的持有者没有正常关闭,则Oracle可能不会立即知道。DBA通常会配置死连接检测以定期向客户端发送ping消息以验证其是否仍然在线,以便数据库可以在几分钟后识别到存在一个死会话并将其回滚。如果数据库没有配置来检测问题并且客户端/服务器应用程序没有关闭事务,则您可能需要等待一段时间。可能有一个限制会话连接时间的配置文件或一个DBA脚本,在一段时间后杀死会话,或者您可能需要呼叫DBA并要求他们杀死其他会话。
注:严谨地说,有用户定义的锁可以通过 dbms_lock 获得,这些锁持续时间为会话而不是事务。但这超出了此问题的范围。

嗨,感谢您的回答。例如,如果应用程序服务器之一(其中调用SQL)崩溃了。在这种情况下,我是否仍然需要死连接检测? - xcoder
@xcoder - 我很难想到有哪些情况下我不需要死连接检测。假设,应用服务器故障的情况很少,DBA可以进入并查找在故障之前从该应用服务器创建的任何会话并将其终止。但这需要您将DBA卷入特定于应用服务器的故障中,这通常不是您想要做的事情。我的强烈偏见是自动化可以自动化的内容。 - Justin Cave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接