今天在项目中遇到了一个问题,增加用户的接口能正常执行,但是修改接口执行报错500,没有找到原因,后来同事提醒后,了解到JPA需要给增删改添加@Transactional注释
public interface UserRepository extends JpaRepository<User, UUID> {
@Query("SELECT u FROM User u WHERE u.user_name=:user_login_name AND u.password=:password")
List<User> checkUser(@Param("user_login_name") String user_login_name,
@Param("password") String password);
@Modifying
@Query("update User u set u.user_name=:user_name,u.user_age=:user_age,u.user_sex=:user_sex WHERE u.id=:id")
void updateUser(@Param("user_age")Integer user_age,
@Param("user_name")String user_name,
@Param("user_sex")String user_sex,
@Param("id")UUID id);
}
分析原因:
1.首先我们要知道事务的四个特性:一致性、原子性、隔离性、持久性
2.这里主要是因为一致性的问题,如果不加上@Transactional注解,那么修改操作默认是只读的事务,也就是从事务提交前到事务提交后,其他的数据库操作是不可见的,这是为了保证数据的一致性
3.也就是因为上诉的原因,在JPA中,没有封装update方法,是通过调用save方法后,先进行查找,找到则修改原有数据,那么如果不添加@transactional注解,此时其他的数据库操作都是不可见的,自然就会报错