我有一种情况,我们正在使用SELECT FOR UPDATE从数据库中获取对象的锁。这对于我们以有序的方式从多个表中插入和删除记录是必要的。该功能的工作原理如下所示。
Login ->获取唯一锁对象的锁并向多个表插入记录并释放锁->注销->获取同一唯一锁对象的锁并从多个表中删除记录并释放锁。
我们启用了同步,以便在用户注销之前跟踪已登录的用户。在Java代码中需要注意这一点。但是,我们在数据库级别获得了另一个锁,以确保当大量用户登录时数据库事务是同步的。
问题:整个系统在多集群服务器和单例服务器中都能完美地工作。但是,当并发用户数达到4000+时,我们将面对数据库中的row lock contention (模式6)。而且很少有用户不能登录。
目的:修复锁定机制,使用户能够成功登录和注销。
到目前为止尝试过的事情:将NOWAIT和SKIP LOCKED添加到SELECT FOR UPDATE查询中。这并不能解决我的问题,因为第一个只是抛出一个错误,而第二个基本上跳过了锁,这会影响同步。
需要数据库专家的建议和意见来解决此问题。蒂娅。
更新:只需再添加一条信息。我们不会更新锁定的行,也不会对其执行任何操作。它只是用作同步我们执行的其他数据库任务的一种机制。
发布于 2017-10-31 17:14:35
不要依赖于悲观锁定(您当前的方法)-使用乐观锁定,可能使用一些ORM。
https://stackoverflow.com/questions/47031522
复制相似问题