有没有办法在 Oracle (10g) 中独占锁定表以进行读取?我对Oracle不是很熟悉,所以我问了DBA,他说在Oracle中不可能锁定一个表来读取?
我实际上正在寻找类似 SQL Server (TABLOCKX HOLDLOCK) 提示的内容。
EDIT:
针对一些答案:我需要锁定表进行读取的原因是实现一个可以被多个客户端读取的队列,但是2个客户端读取同一条记录应该是不可能的。所以实际发生的情况是:
- 锁表
- 读取队列中的下一个项目
- 从队列中删除项目
- 删除表锁
也许还有另一种方法可以做到这一点(更有效)?
如果您只是想阻止任何其他会话修改数据,您可以发出
LOCK TABLE whatever
/
这会阻止其他会话更新数据,但我们不能阻止其他人读取数据。
请注意,在 Oracle 中很少需要这种表锁定,因为 Oracle 运行读取一致性策略。这意味着如果我们运行一个需要十五分钟才能运行的查询,则返回的最后一行将与第一行一致;换句话说,如果结果集以相反的顺序排序,我们仍然会看到完全相同的行。
edit
如果你想实现一个队列(没有实际使用Oracle的内置高级排队功能 http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96587/toc.htm) then SELECT ... FOR UPDATE
是要走的路。这一结构允许一个会话选择并锁定一行或多行。其他会话可以更新未锁定的行。然而,实现一个真正的队列是相当麻烦的,除非你使用的是 11g。 Oracle直到最新版本才支持SKIP LOCKED
条款。了解更多 http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF01702.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)