乐观锁定的重试机制(弹簧数据+ JPA)
我们决定在我们的Web应用程序中使用乐观锁定,以便增加并发性并且不使用悲观锁定。
我们现在正在寻找重试解决方案。
我们希望对我们当前的代码库产生尽可能小的影响。
我们在Web上看到的解决方案之一是使用带注释的重试拦截器将方法标记为可重试。
问题是我们想要注释对它们有@Transactional注释的方法,但拦截器由于某种原因无法重试它们。 (拦截器完美地重试非事务性方法。)
所以:
1)重试的替代方案对我们的代码影响最小吗?
2)该解决方案是否有任何文档\教程?
3)是否可以重试@Transactional注释方法?
干杯!
您有两种方法可以实现此目的,如下所示
从hibernate乐观锁定exception中恢复
要么
使用Spring AOP重试失败的幂等并发操作
希望对你有帮助..!
广告3。
当版本号或时间戳检查失败时(发生乐观锁定),您可以使用Spring Retry重试事务处理方法。
组态
@Configuration @EnableRetry public class RetryConfig { }
用法
@Retryable(StaleStateException.class) @Transactional public void doSomethingWithFoo(Long fooId){ // read your entity again before changes! Foo foo = fooRepository.findOne(fooId); foo.setStatus(REJECTED) // <- sample foo modification } // commit on method end
使用@Transational(propagation = REQUIRED_NEW)
仅重试注释方法中的代码。
- 创建JUnit测试时没有此类方法错误
- 数据库约束违规不会在Hibernate中抛出exception
- 如何在Hibernate注释应用程序中外部化命名查询?
- 从具有相同持久性单元的多个Db读取?
- 如何使用返回参数从Hibernate调用Oracle函数?
- 只是获取id列值而不是在hibernate对象中使用join一对多关系
- java hibernate entity:允许通过id和object本身设置相关对象
- 从Spring MVC XML文件迁移到javaconfig。 我真的迷失了我的数据库XML文件
- MySQLNonTransientConnectionException:连接关闭后不允许任何操作。连接