有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我们正在为这些应用程序使用JPA entitymanager。 这个问题需要帮助吗


共 (1) 个答案

  1. # 1 楼答案

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

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

    1为每个应用程序创建单独的表,然后使用脱机数据更新主表(但u将牺牲数据一致性)

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

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

    也有一些一般的提示要考虑:

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

    2调整事务划分。。。您可能会发现事务打开很长时间而没有任何原因,只是编码错误

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

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

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

    6检查你正在使用的锁类型,根据你的情况,尽量避免任何事情,但不要乐观

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