如何在应用程序级别处理行锁争用
How to handle row lock contention at application level
我有 2 个应用程序(Spring - Hibernate with Boot)使用相同的 oracle 数据库 (11g)。这两个应用程序都一致地点击了特定的 table,并且在这个 table 上有大量的点击。我们可以在数据库日志中看到行锁争用异常,每次我们收到这些异常或当它造成类似死锁的情况时都必须重新启动应用程序。
我们正在为这些应用程序使用 JPA entitymanager。
这个问题需要帮助
根据这个 link :
http://www.dba-oracle.com/t_enq_tx_row_lock_contention.htm
发生此错误是因为一个事务正在等待另一个事务提交或回滚...从数据库 POV 来看此行为是正确的并且如果您考虑数据一致性......但是如果可用性/实现是担心你......你可能需要做一些工作,包括:
1 为每个应用程序创建单独的 tables 然后更新主 table 离线数据(但你会牺牲数据一致性)
2 创建一个单独的线程来记录和重试不成功的事务
3 如果一致性是一个大问题,则承担可用性问题(延迟)
还有一些一般性提示需要考虑:
1 使事务最小化...考虑事务中包含的每个进程。如果是强制性的或者可以在外面移除
2 调整事务划分...您可能会发现事务打开很长时间,原因无非是编码错误
3 不要在事务中进行读操作
4 尽可能避免扩展持久性上下文(无状态)
5 您可能会选择使用非 jta 事务数据源来报告和读取查询
6 检查您正在使用的锁类型,并根据您的情况尽量避免使用除 OPTIMISTIC 之外的任何锁类型
但最后你同意我的看法,我们不应该责怪数据库阻止两个事务修改同一行。
我有 2 个应用程序(Spring - Hibernate with Boot)使用相同的 oracle 数据库 (11g)。这两个应用程序都一致地点击了特定的 table,并且在这个 table 上有大量的点击。我们可以在数据库日志中看到行锁争用异常,每次我们收到这些异常或当它造成类似死锁的情况时都必须重新启动应用程序。
我们正在为这些应用程序使用 JPA entitymanager。 这个问题需要帮助
根据这个 link : http://www.dba-oracle.com/t_enq_tx_row_lock_contention.htm
发生此错误是因为一个事务正在等待另一个事务提交或回滚...从数据库 POV 来看此行为是正确的并且如果您考虑数据一致性......但是如果可用性/实现是担心你......你可能需要做一些工作,包括:
1 为每个应用程序创建单独的 tables 然后更新主 table 离线数据(但你会牺牲数据一致性)
2 创建一个单独的线程来记录和重试不成功的事务
3 如果一致性是一个大问题,则承担可用性问题(延迟)
还有一些一般性提示需要考虑:
1 使事务最小化...考虑事务中包含的每个进程。如果是强制性的或者可以在外面移除
2 调整事务划分...您可能会发现事务打开很长时间,原因无非是编码错误
3 不要在事务中进行读操作
4 尽可能避免扩展持久性上下文(无状态)
5 您可能会选择使用非 jta 事务数据源来报告和读取查询
6 检查您正在使用的锁类型,并根据您的情况尽量避免使用除 OPTIMISTIC 之外的任何锁类型
但最后你同意我的看法,我们不应该责怪数据库阻止两个事务修改同一行。