【发布时间】:2018-04-12 09:26:10
【问题描述】:
我有一种情况,我们使用SELECT FOR UPDATE 从数据库获取对象的锁定。这对于我们以有序的方式从多个表中插入和删除记录是必要的。该功能的工作原理是这样的。
登录 -> 获取唯一锁对象上的锁并将记录插入多个表并释放锁 -> 注销 -> 获取同一唯一锁对象上的锁并从多个表中删除记录并释放锁。
我们启用了同步功能,以便在用户退出之前跟踪用户是否已登录。它在 Java 代码中得到了照顾。但是我们在数据库级别获得了另一个锁,以确保在大量用户登录时数据库事务同步。
问题:整个系统在多集群服务器和单例服务器中都能完美运行。但是,当并发用户数达到4000+时,我们在数据库中面临row lock contention(模式6)。而且很少有用户无法登录。
目的:修复锁定机制,使用户能够成功登录和注销。
到目前为止尝试的事情:将 NOWAIT 和 SKIP LOCKED 添加到 SELECT FOR UPDATE 查询。这并不能解决我的问题,因为第一个只是抛出一个错误,而第二个基本上跳过了会影响同步的锁。
需要数据库专家的建议和意见来解决这个问题。 TIA。
更新:只需添加更多信息。我们不对锁定的行进行更新或做任何事情。它只是用作同步我们执行的其他数据库任务的一种机制。
【问题讨论】:
-
有一个专门用于 dba 的 stackexchange 社区 :-) (dba.stackexchange.com)
-
谢谢。也会在那里发布:)
标签: java database multithreading oracle session