我遇到了这样的情况:我们使用SELECT FOR UPDATE从数据库获取对象的锁。这对于我们以有序的方式从多个表中插入和删除记录是必要的。该功能的工作方式如下所示。
登录->获取唯一锁对象上的锁,并将记录插入到多个表中,并释放锁-> Logout ->获取同一个唯一锁对象的锁,并从多个表中删除记录并释放锁。
我们启用了同步,以跟踪用户在登录之前登录的情况。它是在Java代码中处理的。但是,我们在数据库级别获得另一个锁,以确保在大量用户登录时数据库事务是同步的。
问题:整个系统在多集群服务器和单例服务器中工作得很好。然而,当并发用户数量达到4000+时,我们将面临数据库中的row lock contention (模式6)。而且很少有用户无法登录。
目的:修复锁定机制,使用户能够成功登录和注销。
到目前为止,已经尝试过了:将NOWAIT和SKIP LOCKED添加到SELECT FOR UPDATE查询中。这不能解决我的问题,因为第一个问题只是抛出一个错误,而第二个问题基本上跳过了锁,这会影响同步。
需要数据库专家的建议和意见来解决这个问题。蒂娅。
发布于 2017-11-02 08:52:43
这不能解决我的问题,因为第一个问题只是抛出一个错误
这是解决办法的一部分。您可以捕获错误/异常,然后向客户端显示适当的消息(“您已经登录”、“超过连接限制”等)。
这不是我们可以在数据库中解决的问题。
我也看到过类似的极端情况,事件enq: TX - allocate ITL entry阻塞了事务,这种情况可以在数据库中进行管理。
但我还没有看到enq: TX - row lock contention是一个数据库问题的案例。
https://dba.stackexchange.com/questions/189737
复制相似问题