java - Spring事务回滚 `UPDATE`和 `INSERT`

标签 java sql spring jdbc transactions

@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.updateAmountorderDao.saveenter image description here

最佳答案

您需要手动实现乐观锁定。

为每个表添加 VERSION 列。

当您加载实体时..您需要加载当前版本

当您更新实体时,您必须在 where 子句中添加版本检查并在执行后获取更新的行计数 ( int rowCount = st.executeUpdate(); )

示例:更新帐户设置 AMOUNT = x、VERSION = VERSION+1,其中 ID = XX 且 VERSION = CURRENT_VERSION

如果更新的行计数为 <> 1,则表示该行已被另一个事务( UPDATE 或 DELETE )修改

关于java - Spring事务回滚 `UPDATE`和 `INSERT`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55004463/

相关文章:

java - 我对 Java NIO 感到困惑

mysql - SQL条件更新案例

sql - POSTGRESQL:创建表作为选择特定类型的列

java - Hibernate 分页错误接近限制 - SQL Server

java - 初始化读取器在 Spring 批处理中的一步失败

java - Spring注解——好还是坏?

java.lang.ClassNotFoundException : org. jooq.util.JavaGenerator 异常

spring - 使用 Spring 从外部 jar Autowiring 类

java - 如果在 xml 中手动创建 bean,Spring 注入(inject)将不起作用

java - Spring 4 和 Rest WS 集成