2015-10-27 48 views
1

我有两个进程访问同一个表。它们中的每一个都运行select for update查询并设置WAIT值。WIll选择更新等待会永久锁定行吗?

我的问题是:如果进程1运行查询并在表中锁定n行,如果在提交之前进程崩溃,行如何释放?

我试图打开sql开发者中的两个会话,并在第一个会话中运行select for update,然后关闭它。在第二个会话中查找相同的查询,并发现这些行仍然被锁定!

回答

0

只要事务持续*,事务持有的锁定。释放它们的唯一方法是结束交易。

“坠毁”是什么意思?在三层应用程序中,当前端出现故障时,中间层通常会通过关闭关闭任何关联事务的逻辑会话进行清理。在客户端 - 服务器应用程序中,如果锁的持有者没有正常关闭,Oracle可能不会立即察觉。 DBA通常会配置死连接检测,以便定期向客户端发送ping命令以验证它们是否仍处于活动状态,以便数据库可以在几分钟后识别出存在会话并将其回滚。如果数据库未配置为检测到问题并且客户端/服务器应用程序未关闭事务,则可能需要等待一段时间。可能会有一个配置文件限制会话可以连接的时间或一段时间后会杀死会话的DBA脚本,或者您可能需要调用DBA并要求他们终止其他会话。

*为了迂回,您可以通过dbms_lock获取用户定义的锁,这些锁可以持续存在会话而不是交易。但这超出了这个问题的范围。

+0

嗨,谢谢你的回答。例如,如果其中一个应用程序服务器(其中调用了sql)崩溃了。在这种情况下,我仍然需要死连接检测吗? – xcoder

+0

@xcoder - 我很难想出很多我不希望死连接检测的情况。据推测,应用程序服务器失败的情况非常罕见,因此DBA可以进入并查找在失败之前从该应用程序服务器创建的任何会话并杀死它们。但是这要求您将DBA引入特定于应用程序服务器的故障,这通常不是您想要做的事情。我强烈的偏见会自动化自动化。 –