jpa 在使用过程中会碰到缓存 ,当多次操作数据库 时会导致数据不一致,出现脏数据。
目录
举例:
A表更新逻辑如下
1、查询数据库A 表中的数据
2、采用原生sql 当修改完成后数据库是执行了状态修改,
3、再用jpa的 save()方法做保存 逻辑2中修改后的状态就会被覆盖为查询前的数据(这里执行完逻辑2, jpa查询取到的数据就是缓存数据并不是数据库的最新数据) 。
tips:(有些业务特殊无法保持数据的一致性,所以采用sql + 实体的更新方式)
解决方法:
引入jpa 的EntityManager
import javax.persistence.EntityManager;
@PersistenceContext
private EntityManager em;
tips: 使用过程中 使用方法需要事务管理 需加上 @Transactional
部分代码仅做参考
@Transactional
private void deliveryOrder(String salesBillNo,Map<String, String> map ) throws Exception {
SalesBillHead bySalesBillNo = salesBillHeadRepository.getBySalesBillNo(salesBillNo);
// 将缓存中数据存入数据库
em.flush();
// 获取数据库 最新 数据
em.refresh(bySalesBillNo);