java - 如何在应用程序级别处理行锁争用

标签 java spring jpa row contention

我有 2 个应用程序(Spring - Hibernate with Boot)使用相同的 Oracle 数据库 (11g)。两个应用程序一致地点击特定的表,并且该表上有大量的点击。我们可以在数据库日志中看到行锁争用异常,并且每次收到这些异常或当它创建类似死锁的情况时都必须重新启动应用程序。

我们正在为这些应用程序使用 JPA 实体管理器。 需要此问题的帮助

最佳答案

根据此链接: http://www.dba-oracle.com/t_enq_tx_row_lock_contention.htm

发生此错误的原因是一个事务正在等待另一个事务提交或回滚...从数据库 POV 来看,这种行为是正确的,并且如果您考虑数据一致性...但是如果可用性/履行是一个问题对于你...你可能需要做一些解决办法,包括:

1为每个应用程序建立单独的表,然后离线更新主表数据(但会牺牲数据一致性)

2 创建一个单独的线程来记录和重试不成功的事务

3 如果一致性是一个大问题,则需要承担可用性问题(延迟)

还有一些需要考虑的一般提示:

1 使事务最小化...考虑事务中包含的每个流程。如果是强制性的或者可以在外部删除

2 调整交易划分...你可能会发现交易长时间开放,没有任何原因,但编码很糟糕

3 不要在事务内进行读取操作

4 尽可能避免扩展持久化上下文(无状态)

5 您可能会选择使用非 jta 事务数据源来报告和读取查询

6 检查您正在使用的锁类型,并根据您的情况尽量避免使用除 OPTIMISTIC 之外的任何类型

但最后你同意我的观点,我们不应该责怪数据库阻止两个事务修改同一行。

关于java - 如何在应用程序级别处理行锁争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48731743/

相关文章:

Java时间: preserve date and time to other timezone

java - Android AWS Cognito : unable to resolve host

Spring Boot Security 请求的资源上不存在 'Access-Control-Allow-Origin' header 错误

java - Spring session bean : initialize with values

java - 为什么@Column 可能不适用于方法?

java - 如何使用 HQL (Hibernate) 查询日期的平均天数差异?

java - 如何在 Java 中动态求和文本字段数组

java - Tycho 无法解决片段对其他片段的依赖

java - Spring-Hibernate-JPA-Spring-Data-Maven-JSF应用Tomcat启动错误

java - 无法 Autowiring 。未找到 'NoteRepository' 类型的 beans