我遇到的情况是我们使用SELECT FOR UPDATE
从数据库获取对象的锁定。这对于我们以有序的方式插入和删除多个表中的记录是必要的。功能就像这样。
登录 - >获取对唯一锁定对象的锁定并将记录插入多个表并释放锁定 - >退出 - >获取相同唯一锁定对象的锁定并从多个表中删除记录并释放锁定。
我们已启用同步以跟踪用户在登出之前已登录的情况。它在Java代码中得到了关注。但是,我们在数据库级别获取另一个锁,以确保在大量用户登录时同步数据库事务。
问题:整个系统在多群集服务器和单一服务器中运行良好。但是,当并发用户数达到4000+时,我们在数据库中面临row lock contention
(模式6)。很少有用户无法登录。
目标:修复锁定机制,使用户能够成功登录和注销。
到目前为止已尝试的事项:已将NOWAIT
和SKIP LOCKED
添加到SELECT FOR UPDATE
查询。这并没有解决我的问题,因为第一个只是抛出一个错误而第二个基本上会跳过会影响同步的锁。
需要数据库专家提出的建议和意见才能解决此问题。 TIA。
更新:只需添加一个信息。我们不会更新锁定行或对锁定行执行任何操作。它仅用作同步我们所做的其他数据库任务的机制。
答案 0 :(得分:0)
而不是依赖悲观锁定(您当前的方法) - 使用乐观锁定可能使用某些ORM。