Executing an update/delete query报错

如果JPA提示Executing an update/delete query,那是一定是因为Service层没有加@Transactional和再方法加@Modifying吧。

异常场景

spring-boot+jpa执行新增修改删除操作时:

public interface UserRepository extends JpaRepository<User , Integer>{

    @Modifying
    @Query(value="update User set state = ?1,lastupdatetime = ?2 where id= ?3")
    void updateUser(int state,Date nowDate,Integer id);

}

异常: Executing an update/delete query

解决方案

因为jpa要求,’没有事务支持,不能执行更新和删除操作’。

所以反过来讲,就是在Service层或者Repository层上必须加@Transactional,来代表这是一个事务级别的操作,增删改查除了查都是事务级别的,就当这是一个规范也是ok的。

为什么注释加在service层?


结合事务的特点,为什么加在service层就很好解释了。如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来,尤其是事务的一致性,当出现并发问题是,用户从数据库查到的数据都会有所偏差。
一般的时候,我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。

什么是事务?


在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。判断事务是否配置成功的关键点在于出现异常时事务是否会回滚

事务四大特性


1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏

3.隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰.

4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的.即使系统重启也不会丢失.

猜你喜欢

转载自blog.csdn.net/My_SweetXue/article/details/114031221