同一事务中获取不到修改数据
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();
@Autowired
private InventoryListDao inventoryListDao;
@Override
public void updateClassifyType(List<Integer> idList, String classifyType) {
inventoryListDao.updateClassifyType(idList, classifyType);
}
@Override
public List<InventoryListEntity> getByIds(List<Integer> idList) {
return inventoryListDao.getByIds(idList);
}
@Override
public 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;
}
@Override
public 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());
@Autowired
private InventoryListService inventoryListService;
// 默认事务隔离级别
@Override
@Transactional
public 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 {
@Autowired
private 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实体的修改