大型事务的行锁争用问题



我有一种情况,我们使用SELECT FOR UPDATE从数据库中获取对象的锁。这对于我们有序地插入和删除多个表中的记录是必要的。该功能的工作原理类似于此。

登录->获取唯一锁定对象的锁定并将记录插入多个表并解除锁定->注销->获取同一唯一锁定对象上的锁定并从多个表中删除记录并解除锁定。

我们启用了同步功能,以跟踪用户在注销之前已登录。它在Java代码中得到了处理。然而,我们在数据库级别获得了另一个锁,以确保在大量用户登录时数据库事务是同步的

问题:整个系统在多集群服务器和单实例服务器中都能完美工作。然而,当并发用户数达到4000+时,我们在数据库中面临row lock contention(模式6)。而且很少有用户无法登录。

目标:修复锁定机制,使用户能够成功登录和注销。

到目前为止已经尝试了:将NOWAITSKIP LOCKED添加到SELECT FOR UPDATE查询中。这并不能解决我的问题,因为第一个只是抛出一个错误,而第二个基本上跳过了会影响同步的锁。

需要数据库专家的建议和意见来解决这个问题。TIA。

更新:只是添加了一个信息。我们不会更新或对锁定的行执行任何操作。它只是作为一种机制来同步我们所做的其他数据库任务

不要依赖悲观锁定(您当前的方法),而是使用乐观锁定,可能使用一些ORM。

最新更新