博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么JPA@Modifying需要@Transactional注解
阅读量:3936 次
发布时间:2019-05-23

本文共 989 字,大约阅读时间需要 3 分钟。

 

 

在JPA开发中遇到一个很奇怪的问题,@Modifying需要和@Transactional配合使用才能正常使用。如下面代码所示

@Modifying  @Transactional  @Query("delete from User u where u.active = false")  void deleteInactiveUsers();

 

为什么@Modifying和@Transactional配合才能使用?首先需要了解@Modifying和@Transactional的作用,@Modifying的主要作用是声明执行的SQL语句是更新(增删改)操作,@Transactional的主要作用是提供事务支持(提供例如隔离性等事务特性,JPA默认会依赖JDBC默认隔离级别)。

 

 

查阅SpringDataJPA文档可以看到下面一段话

By default, CRUD methods on repository instances are transactional. For read operations, the transaction configuration readOnly flag is set to true. All others are configured with a plain @Transactional so that default transaction configuration applies. For details, see JavaDoc of SimpleJpaRepository.

 

这段话的大致意思是默认情况下JPA的每个操作都是事务的,在默认情况下,JPA的事务会设置为只读,具体可以参考SimpleJpaRepository。

这样@Modifying和@Transactional为什么配合才能使用的原因就很明显了,实质上@Modifying只是声明了这个操作是一个修改操作,但却没有修改这个方法的事务等级,因此这个方法依然不能进行修改操作。只有声明了@Transactional,本质上是声明了@Transactional(readOnly=false),这样覆盖了默认的@Transactional配置便可以执行修改操作了。

 

 
 
 
 
 
 
 
posted @ 2019-05-17 17:12 阅读(...) 评论(...)

转载地址:http://aohgn.baihongyu.com/

你可能感兴趣的文章
用Elasticsearch构建电商搜索平台,一个极有代表性的基础技术架构和算法实践案例(转)
查看>>
使用 Binlog 和 Canal 从 MySQL 抽取数据(转)
查看>>
谈谈对Canal( 增量数据订阅与消费 )的理解(转)
查看>>
Canal数据库同步组件(转)
查看>>
ElasticSearch + Canal 开发千万级的实时搜索系统(转)
查看>>
ElasticSearch + Canal搭建搜索系统(整理中)
查看>>
Centos系统安装MySQL(整理)
查看>>
Ubuntu 下PostgreSQL、postgis安装与配置
查看>>
postgresql计算两点距离(经纬度地理位置)
查看>>
postgres多边形存储--解决 Points of LinearRing do not form a closed linestring
查看>>
postgresql+postgis空间数据库总结
查看>>
spring 之 Http Cache 和 Etag(转)
查看>>
JAVA8-用lamda表达式和增强版Comparator进行排序(转)
查看>>
基于Lucene查询原理分析Elasticsearch的性能(转)
查看>>
依赖多个项目,重复jar包不同版本冲突解决
查看>>
阿里 weex--前端整合开源框架(记录)
查看>>
spring event的事件驱动模型(转)
查看>>
阿里开源在线诊断工具-Arthas(阿尔萨斯)
查看>>
kubernetes(整理中)
查看>>
Deepin 下安装 Docker
查看>>