ORACLE中的MySQL LOCK表

时间:2014-08-26 06:29:51

标签: mysql oracle locking

我正在尝试锁定Oracle中的一些表。我的MySQL查询如下所示:

LOCK TABLES mytable WRITE;

我尝试在Oracle中使用此查询:

LOCK TABLE mytable IN SHARE MODE;

我收到“LOCK succeeded”消息,但我仍然可以在另一个会话中从此表中进行SELECT。

我做错了吗?

由于

3 个答案:

答案 0 :(得分:2)

Oracle使用多版本读取一致性。这意味着,除其他外,读者从不阻止作家和作家永远不会阻止读者。因此,没有锁可以阻止用户(当然具有适当的权限)查询表。在绝大多数情况下,阻止读者阅读数据是没有意义的;即使您正在删除所有数据并将其重新插入到不同的会话中,只要您在单个事务中执行此操作,读者和编写者就永远不会相互阻止。同样地,在Oracle中明确地锁定表格也是非常不寻常的 - 我个人在我的Oracle职业生涯中遇到过明确锁定表格的情况。

如果您确实需要阻止读者阅读数据,您需要实施自己的序列化机制。例如,您可以在编写器启动之前使用dbms_lock获取自定义锁定,然后在执行SELECT语句之前对读取器进程进行编码以检查该锁定。或者,您可以拥有一个正在运行的进程表,您可以将其作为加载进程的一部分写入,并在执行任何读取之前对读取器进程进行编码以检查该表。就像我上面所说的那样,将这种复杂性添加到你的系统中是很有意义的。

答案 1 :(得分:0)

尝试REVOKE/GRANT权限:

REVOKE SELECT ON mytable FROM public;

在旁注中,如果您希望权限属于某个组,您也可以定义用户。

答案 2 :(得分:0)

Oracle旨在以不同的方式使用。通常当您需要在Oracle中锁定表时,您的设计会出现问题,因为您的应用程序无法扩展。此外,LOCK TABLE声明有一些罕见的限制。例如,它不会传播到逻辑备用数据库。