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

时间:2018-02-11 13:01:22

标签: java spring jpa row contention

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

我们正在使用JPA entitymanager来处理这些应用程序。 需要帮助解决这个问题

1 个答案:

答案 0 :(得分:0)

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

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

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

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

如果一致性是一个大问题,

3承担可用性问题(延迟)

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

1使交易最小化...考虑交易中包含的每个流程。如果是必须的或可以在外面删除

2调整事务划分... U可能会发现事务很长时间没有任何原因而且编码错误

3不要在事务中进行读操作

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

5你可以选择使用非jta交易数据源来报告和阅读查询

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

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