我正在尝试锁定Oracle中的一些表。我的MySQL查询如下所示:
LOCK TABLES mytable WRITE;
我尝试在Oracle中使用此查询:
LOCK TABLE mytable IN SHARE MODE;
我收到“LOCK succeeded”消息,但我仍然可以在另一个会话中从此表中进行SELECT。
我做错了吗?
由于
答案 0 :(得分:2)
Oracle使用多版本读取一致性。这意味着,除其他外,读者从不阻止作家和作家永远不会阻止读者。因此,没有锁可以阻止用户(当然具有适当的权限)查询表。在绝大多数情况下,阻止读者阅读数据是没有意义的;即使您正在删除所有数据并将其重新插入到不同的会话中,只要您在单个事务中执行此操作,读者和编写者就永远不会相互阻止。同样地,在Oracle中明确地锁定表格也是非常不寻常的 - 我个人在我的Oracle职业生涯中遇到过明确锁定表格的情况。
如果您确实需要阻止读者阅读数据,您需要实施自己的序列化机制。例如,您可以在编写器启动之前使用dbms_lock
获取自定义锁定,然后在执行SELECT
语句之前对读取器进程进行编码以检查该锁定。或者,您可以拥有一个正在运行的进程表,您可以将其作为加载进程的一部分写入,并在执行任何读取之前对读取器进程进行编码以检查该表。就像我上面所说的那样,将这种复杂性添加到你的系统中是很有意义的。
答案 1 :(得分:0)
答案 2 :(得分:0)
Oracle旨在以不同的方式使用。通常当您需要在Oracle中锁定表时,您的设计会出现问题,因为您的应用程序无法扩展。此外,LOCK TABLE
声明有一些罕见的限制。例如,它不会传播到逻辑备用数据库。