当前位置: 首页 > 知识库问答 >
问题:

从hibernate乐观锁定异常中恢复

武睿
2023-03-14

我有一个这样的方法:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
 Entity = entity = dao.loadEntity();
 // do some related work
 ...
 try {
  dao.saveEntity(entity);
 }
 catch(StaleObjectStateException sose){
  dao.flush(entity);
  doSomeWork();
 }
}

我希望通过使用REQUIRES_NEW事务传播和所示的递归,StaleObjectStateException最终会被清除,但事实并非如此。

如何从此异常恢复?

共有1个答案

于鹏
2023-03-14

结果我忽略了一个“gatcha”...

来自spring docs

在代理模式下(这是默认值),只有通过代理进入的“外部”方法调用才会被拦截。这意味着“自调用”(即目标对象内的方法调用目标对象的其他方法)在运行时不会导致实际事务,即使被调用的方法标记为@transactional!

@Autowired
private ApplicationContext applicationContext;

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
 Entity = entity = dao.loadEntity();
 // do some related work
 ...
 try {
  dao.saveEntity(entity);
 }
 catch(StaleObjectStateException sose){
  dao.flush(entity);
  applicationContext.getBean(this.getClass()).doSomeWork();
 }
}
 类似资料:
  • 问题内容: 我有这样的方法: 我期望通过使用REQUIRES_NEW事务传播和所示的递归,StaleObjectStateException最终将被清除,但事实并非如此。 如何从此异常中恢复? 问题答案: 原来有一个我忽略了的“ gatcha” … 从Spring文档 在代理模式(默认)下,将仅拦截通过代理传入的“外部”方法调用。这意味着即使调用的方法标记有@Transactional,“自调用”

  • 我试图在不同的事务中更新同一行,以理解Hibernate的乐观锁定。 但是我没有得到任何StaleObjectStateException或任何其他异常。 我已经在我正在尝试执行的操作上方附加了代码。请让我知道..我错过了什么吗? 或者乐观锁定与我正在尝试做的事情不同。 在上面的代码中,我启动了两个线程“早些时候”和“晚些时候”,它们都从会话工厂获取会话对象,并从数据库加载相同的记录并同时更新它。

  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 我使用SpringDataJPA和Hibernate作为PostgreSQL上的持久性提供者。我试图提供悲观锁定: 我尝试从两个线程中调用< code>findOneAndLock。我认为,如果< code >线程A锁定了对象,那么< code >线程B应该等到锁被释放。而是< code >线程B抛出< code > org . spring framework . ORM . objectopt

  • 问题内容: 我找不到有关MySQL中乐观锁定的任何详细信息。我读到开始事务使两个实体上的更新保持同步,但是,它不会停止两个用户同时更新数据而引起冲突。 显然乐观锁定会解决这个问题吗?这在MySQL中如何应用。是否有SQL语法/关键字呢?还是MySQL具有默认行为? 谢谢你们。 问题答案: 关键是,乐观锁定不是数据库功能,不适用于MySQL或其他功能:乐观锁定是一种使用带有标准指令的DB进行的实践。

  • 我有一个关于Hibernate中乐观锁定的问题。我正试图深入乐观地锁定Hibernate,但我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,可以使用@Version注释(或xml配置)并创建版本属性。另一个选项是在不使用乐观lock=“all”属性进行版本控制的情况下进行配置。 我的问题是,如果你没有定义任何版本属性,也没有指定乐观锁属性,在这种情况下,哪种