Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在应用程序级别处理行锁争用_Java_Spring_Jpa_Row_Contention - Fatal编程技术网

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

Java 如何在应用程序级别处理行锁争用,java,spring,jpa,row,contention,Java,Spring,Jpa,Row,Contention,我有两个应用程序Spring-Hibernate,使用相同的oracle数据库11g启动。这两个应用程序一致地命中一个特定的表,并且在这个表上有大量的命中率。我们可以在数据库日志中看到行锁争用异常,每当我们得到这些异常或出现类似死锁的情况时,应用程序都必须重新启动 我们正在为这些应用程序使用JPA entitymanager。 需要有关此问题的帮助,请参见此链接: 发生此错误的原因是一个事务正在等待另一个事务提交或回滚。。。从数据库POV来看,这种行为是正确的,如果考虑到数据一致性。。。。。但

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

我们正在为这些应用程序使用JPA entitymanager。 需要有关此问题的帮助,请参见此链接:

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

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

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

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

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

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

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

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

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

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

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


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

当一个表不断插入和更新时,就会出现此问题。这两个应用中有一个实现了5个spring调度程序,它们也会命中同一个表。很抱歉在评论部分添加信息。谢谢您的回答。。!!我创建了一个单独的服务,它使用来自这些应用程序的rest调用,并且该服务插入/更新表。还添加了悲观写锁以避免死锁。请让我知道您对同一问题的看法。如果我理解正确,那么您创建的另一个WS不是让两个应用程序同时写入同一个数据库,而是同时使用这两个应用程序并写入数据库,因此不再存在同步问题。。。如果是这样的情况,我认为没有必要使用锁,除非出于其他原因,我不知道……据我所知,乐观锁不能避免死锁,相反,您正在增加受保护区域的表面积,使其更容易死锁,特别是如果您使用扩展锁定模式锁定实体及其相关对象,我们仍然会遇到相同的问题。我认为交易时间很长。有超时日志表明。单个事务包含对不同表的插入和更新。乐观锁定不能防止死锁。请建议任何有助于进一步的解决方案。cab请确认我在前面的评论中提到的案例描述对不起,我的意思是:悲观锁不能避免死锁