【问题标题】:Row lock contention issue with large transactions大型事务的行锁争用问题
【发布时间】:2018-04-12 09:26:10
【问题描述】:

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

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

我们启用了同步功能,以便在用户退出之前跟踪用户是否已登录。它在 Java 代码中得到了照顾。但是我们在数据库级别获得了另一个锁,以确保在大量用户登录时数据库事务同步。

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

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

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

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

更新:只需添加更多信息。我们不对锁定的行进行更新或做任何事情。它只是用作同步我们执行的其他数据库任务的一种机制。

【问题讨论】:

  • 有一个专门用于 dba 的 stackexchange 社区 :-) (dba.stackexchange.com)
  • 谢谢。也会在那里发布:)

标签: java database multithreading oracle session


【解决方案1】:

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

【讨论】:

  • 你能提供一个基本的解释吗?我读过乐观锁定。它基本上谈论使用 UPDATE 而不是 SELECT FOR UPDATE。我们还需要做更多的步骤来分别处理并发。也许,您可以提供一些博客文章的链接?感谢回复!
  • 请检查问题中的更新。我们不锁定对象来更新它。我们锁定一个对象,然后执行几个 INSERT、DELETE、UPDATE 语句。一旦我们完成所有这些,我们就会释放锁。乐观锁基于更新记录的版本号工作。我觉得它很复杂,在我的情况下可能是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2014-02-21
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
相关资源
最近更新 更多