【发布时间】:2022-02-07 01:44:18
【问题描述】:
我有这种情况:
@Transactional
public void setStopped(Machine machine)
{
machine.setStatus(StatusType.STOPPED);
machineRepository.saveAndFlush(machine);
}
@Transactional
public void setRunningAndAvailable(Machine machine)
{
machine.setStatus(StatusType.RUNNING);
machine.setAvailable(true);
machineRepository.saveAndFlush(machine);
}
@Async
public void restart(Machine machine, int bound, int sec)
{
try
{
if(machine.getStatus().equals(StatusType.RUNNING))
{
Random random = new Random();
int number = random.nextInt(bound) * 1000;
Thread.sleep((sec * 1000L) + number);
setStopped(machine);
number = random.nextInt(bound) * 1000;
Thread.sleep((sec * 1000L) + number);
setRunningAndAvailable(machine);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
我不断收到以下错误:
org.springframework.orm.ObjectOptimisticLockingFailureException
Caused by:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another
transaction (or unsaved-value mapping was incorrect)
第一种方法结束后数据库没有更新 (setStopped),当我第二次尝试 saveAndFlush (setRunningAndAvailable) 时出现这些错误,这让我相信不知何故第一笔交易是仍在进行中。
我尝试做@Transactional(propagation = Propagation.NESTED) 和@Transactional(propagation = Propagation.REQUIRES_NEW),但我得到了同样的错误。
我不知道为什么会一直这样,如果有人可以帮助我,我将不胜感激。
【问题讨论】:
标签: java mysql spring asynchronous transactions