ORACLE中的MySQL锁表

ORACLE中的MySQL锁表,mysql,oracle,locking,Mysql,Oracle,Locking,我正试图在Oracle中锁定一些表。我的MySQL查询如下所示: LOCK TABLES mytable WRITE; 我尝试在Oracle中使用此查询: LOCK TABLE mytable IN SHARE MODE; 我收到锁定成功消息,但我仍然能够在另一个会话中从此表中进行选择 我做错什么了吗 谢谢Oracle使用多版本读取一致性。这意味着,除其他外,读者永远不会阻止作者,作家也永远不会阻止读者。因此,没有可以取出的锁会阻止具有适当权限的用户查询表。在绝大多数情况下,阻止读者阅读数据

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

LOCK TABLES mytable WRITE;
我尝试在Oracle中使用此查询:

LOCK TABLE mytable IN SHARE MODE;
我收到锁定成功消息,但我仍然能够在另一个会话中从此表中进行选择

我做错什么了吗


谢谢

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

如果确实需要防止读取器读取数据,则需要实现自己的序列化机制。例如,您可以在编写器启动之前使用dbms_锁获取自定义锁,然后在执行SELECT语句之前对读取器进程进行编码以检查该锁。或者,您可以拥有一个运行进程表,该表由您维护,作为加载进程的一部分写入,并对读取器进程进行编码,以便在执行任何读取之前检查该表。不过,正如我上面所说,将这种复杂性添加到您的系统中是非常不寻常的

REVOKE SELECT ON mytable FROM public;

另一方面,如果您希望权限是组专有的,您还可以定义用户。

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

锁定仅用于防止任何更新/插入。如果要限制选择,可以尝试取消该权限。通过取消选择权限,我的会话将无法同时选择任何数据,对吗?是。您可能需要为读/写和只读使用不同的id。我在MySQL中使用表锁,以避免用户选择相同的数据。例如,调用队列中下一个人的应用程序。在MySQL中,当有许多用户同时呼叫时,可能会发生两个用户获得相同的下一个号码的情况。我避免使用表读取锁。这在Oracle中是不会发生的?出于类似的目的,Oracle有自己的queening/消息传递系统,称为Advanced queuing AQ。或者您正在使用这种类型的锁定来选择下一个可用资源?Like表包含一个车票号码列表,每个车票号码只能出售一次?