同一事务中获取不到修改数据
spring-boot-starter-parent版本2.7.12
Dao
@Query(value = "select * from inventory_list where id in (?1) order by id desc",nativeQuery = true)
List<InventoryListEntity> getByIds(List<Integer> idList);@Modifying
@Query(value = "update inventory_list set CLASSIFY_TYPE = ?2 where id in (?1)",nativeQuery = true)
void updateClassifyType(@Param(value = "ids") List<Integer> id,@Param(value = "classifyType") String classifyType);
Service
InventoryListService
public interface InventoryListService {List<InventoryListEntity> getByIds(List<Integer> idList);void updateClassifyType(List<Integer> idList, String classifyType);boolean updateClassifyTypeToE(List<Integer> idList);boolean updateClassifyTypeToI(List<Integer> idList);
}
UserService
public interface UserService {boolean updateClassifyType(List<Integer> idList);
}
ServiceImpl
InventoryListServiceImpl
@Component
public class InventoryListServiceImpl implements InventoryListService {private final Log log = LogFactory.getLog(this.getClass());Gson gson = new Gson();@Autowiredprivate InventoryListDao inventoryListDao;@Overridepublic void updateClassifyType(List<Integer> idList, String classifyType) {inventoryListDao.updateClassifyType(idList, classifyType);}@Overridepublic List<InventoryListEntity> getByIds(List<Integer> idList) {return inventoryListDao.getByIds(idList);}@Overridepublic boolean updateClassifyTypeToE(List<Integer> idList) {List<InventoryListEntity> entityList = getByIds(idList);if (entityList.size() < idList.size()){log.warn("存在未查到数据");return false;}for (InventoryListEntity entity : entityList) {log.info("? to E,classifyType: " + gson.toJson(entity.getClassifyType()));}updateClassifyType(idList, "E");return true;}@Overridepublic boolean updateClassifyTypeToI(List<Integer> idList) {List<InventoryListEntity> entityList = getByIds(idList);if (entityList.size() < idList.size()){log.warn("存在未查到数据");return false;}for (InventoryListEntity entity : entityList) {log.info("E to I,classifyType: " + gson.toJson(entity.getClassifyType()));if (!"E".equals(entity.getClassifyType())){return false;}}updateClassifyType(idList, "I");return true;}
}
UserServiceImpl
@Component
public class UserServiceImpl implements UserService {private final Log log = LogFactory.getLog(this.getClass());@Autowiredprivate InventoryListService inventoryListService;// 默认事务隔离级别@Override@Transactionalpublic boolean updateClassifyType(List<Integer> idList) {boolean flag1 = inventoryListService.updateClassifyTypeToE(idList);if (!flag1){return false;}log.info("updateClassifyTypeToE success");boolean flag2 = inventoryListService.updateClassifyTypeToI(idList);if (!flag2){log.info("updateClassifyTypeToE false");return false;}return true;}}
Controller
@RestController
public class JpaEntityController {@Autowiredprivate UserService userService;@PostMapping("/jpa/entity/test")public String jpaEntityTest(@RequestBody List<Integer> idList){boolean flag = userService.updateClassifyType(idList);if (flag){return "true";}return "false";}
}
请求结果日志
数据最终都会被改成之前第一次修改的状态
解决方式
将修改换成对entity实体的修改