Spring配置中transactionAttributes的使用方法介绍

发布时间 - 2026-01-11 03:29:49    点击率:

最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但是去掉关联关系后的效果不显著。

查找spring的相关配置,发现原来关于“transactionAttributes”有问题。原来的配置如下:

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
lazy-init="true" abstract="true"> 
<property name="transactionManager"> 
<ref bean="transactionManager" /> 
</property> 
<property name="transactionAttributes"> 
<props> 
<prop key="sav*">PROPAGATION_REQUIRED</prop> 
<prop key="update*">PROPAGATION_REQUIRED</prop> 
<prop key="delete*">PROPAGATION_REQUIRED</prop> 
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
</props> 
</property> 
</bean> 

使用上述配置,在JPA打出的日志中显示每次查询时都要进行更新操作,查阅相关spring 的资料后发现transactionAttributes的各种属性的意义,现把资料分享如下:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与

PROPAGATION_REQUIRED类似的操作。

当前所有的事务都使用“PROPAGATION_REQUIRED”属性值,并且控制事务的操作权限为只读,以保证查询时不会更新数据。根据上述 定义 “PROPAGATION_REQUIRED”属性会造成为所有的操作都创建事务,从而会出现JPA的日志中查询时也会进行更新操作的现象,也就造成了效 率的低下。将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升,但是此时担心一个问题:比如在一 个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。
另外,如果出现

〈prop key="myMethod"〉PROPAGATION_REQUIRED,readOnly,-Exception〈/prop〉 

这样的配置,其中:

-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交

readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.

总结

以上就是本文关于Spring配置中transactionAttributes的使用方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:浅谈Springboot之于Spring的优势 、  Spring事务传播属性和隔离级别详细介绍  、 浅谈Spring Boot 微服务项目的推荐部署方式等。感谢大家对本站的支持。


# Spring配置  # transactionAttributes  # spring  # mybatis事务管理配置与@Transactional注解使用详解  # Spring事务Transaction配置的五种注入方式详解  # Spring中配置Transaction与不配置的区别及说明  # 抛出  # 浅谈  # 挂起  # 这是  # 关联关系  # 就会  # 是因为  # 也会  # 都要  # 也就  # 会不会  # 这个问题  # 感兴趣  # 就把  # 详细介绍  # 造成了  # 一个问题  # 在一  # 则在  # 就以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  北京专业网站制作设计师招聘,北京白云观官方网站?  如何构建满足综合性能需求的优质建站方案?  微信小程序 HTTPS报错整理常见问题及解决方案  利用vue写todolist单页应用  javascript基本数据类型及类型检测常用方法小结  高防服务器租用指南:配置选择与快速部署攻略  做企业网站制作流程,企业网站制作基本流程有哪些?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  JavaScript实现Fly Bird小游戏  什么是javascript作用域_全局和局部作用域有什么区别?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在云服务器上快速搭建个人网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  微信小程序 配置文件详细介绍  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel如何实现API资源集合?(Resource Collection教程)  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在万网自助建站中设置域名及备案?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  js实现获取鼠标当前的位置  如何在服务器上三步完成建站并提升流量?  如何安全更换建站之星模板并保留数据?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何生成URL和重定向?(路由助手函数)  微信小程序 input输入框控件详解及实例(多种示例)  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel如何使用Service Container和依赖注入?(代码示例)  如何在阿里云域名上完成建站全流程?  如何在搬瓦工VPS快速搭建网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  JS碰撞运动实现方法详解  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  移动端脚本框架Hammer.js  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  JavaScript如何实现错误处理_try...catch如何捕获异常?  javascript读取文本节点方法小结  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  ,南京靠谱的征婚网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  详解jQuery中基本的动画方法  Android okhttputils现在进度显示实例代码