0

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

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

4

1 回答 1

1

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

发生此错误是因为一个事务正在等待另一个事务提交或回滚......从数据库 POV 来看,这种行为是正确的,如果您考虑数据一致性......但如果可用性/履行是您关心的问题。 ..您可能需要做一些工作,包括:

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

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

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

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

1 使事务最小化......考虑事务中包含的每个过程。如果它是强制性的或可以在外面移除

2 调整事务分界...您可能会发现事务无故打开很长时间,但编码错误

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

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

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

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

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

于 2018-02-11T19:40:51.737 回答