业务上需要两个表一起更新的时候最好加事务,单个表不用,数据库有默认的事务隔离
举例子,比如说转账, 从A账户转移到B账户, A减去金额,则同时B需要加上金额
在类似的场景下,涉及到两个表相关联的更新,要加上事务
但是千万注意!!!不要在耗时长的操作里面加事务,事务粒度也要适中
spring提供了@transactionTemplate 方法级别的事务注解,使用方便
但是 方法级别的事务,粒度不够细。
比如说如下场景
NotifyCapitalDetailModify方法里面有三个数据库操作,一个查询,两个更新
如果用方法级别的@transactionTemplate 注解 ,则把该方法里面所有涉及到的操作都置于事务范围内。
因此 可以使用spring提供的TransactionTemplate 工具类来控制细粒度事务
使用spring的TransactionTemplate
先注入
查看TransactionTemplate 源码里面,核心方法是execute
execute方法里面的核心又是action.doInTransaction(status);
这个就是我们的业务操作,然后最下面this.transactionManager.commit(status); 提交事务
因此 我们需要把action.doInTransaction(status); 这个操作传入到TransactionTemplate里面去
具体使用如下,实现了一个 TransactionCallback的匿名对象 重写它的 doInTransaction方法 把我们的操作放进去即可
transactionTemplate.execute(new TransactionCallback(){
@Override
public Boolean doInTransaction(TransactionStatus status) {
capitalImportDOMapper.updateByExample(capitalImport,modifyEx);
capitalDetailDOMapper.updateByExample(capitalDetailDO,capitalDetailDOExample);
return Boolean.TRUE;
}
});
也可以通过lamada表达式来简化 ,因为这个TransactionCallback接口是个函数式接口