Spring Transaction откатит и `UPDATE` и` INSERT` - PullRequest
0 голосов
/ 05 марта 2019
@Service
@Transactional
public class OrderService {

  //Implemented with JdbcTemplate (no ORM)
  //Both Dao use the same DataSource
  private AccountDao accountDao;
  private OrderDao orderDao;

public void update(int accountId){

  //Get account and do some calculation (simplifed version here)
  Account account = accountDao.findByid(accountId)
  int newAmount = account.getAmoount * 100;

  //Update account table 
  accountDao.updateAmount(accountId, newAmount);

  //Insert new order
  Order order = ....
  orderDao.save(order);

}

}

В приведенном выше коде я хотел бы откатить accountDao.updateAmount и orderDao.save, если обновленная строка учетной записи была изменена другой транзакцией. enter image description here

1 Ответ

1 голос
/ 06 марта 2019

Вам необходимо реализовать оптимистическую блокировку ручного режима.

Добавить столбец VERSION для каждой таблицы.

При загрузке и сущности .. вам нужно загрузить текущую версию

при обновлении сущности необходимо добавить проверку версии в предложении where и получить обновленный счетчик строк после выполнения (int rowCount = st.executeUpdate();)

пример: UPDATE ACCOUNT set AMOUNT = x, VERSION = VERSION+1 where ID = XX and VERSION = CURRENT_VERSION

Если обновленный счетчик строк равен <> 1, это означает, что строка была изменена другой транзакцией (UPDATE или DELETE)

...