spring 事务注解配置以及实践

Spring Boot中的事务管理,你了解多少? 🏆 本文精选收录于《滚雪球学SpringBoot》专栏,专为零基础学习者量身打造。从Spring基础到项目实战,手把手带你掌握核心技术,助力你快速提升,迈向职场巅峰,开启财富自由之路🚀!无论你是刚入门的小白,还是已有基础的开发者,都能在这里找到适合自己的学习路径!    🌟 关注、收藏、订阅,持续更新中!和我们一起高速成长,突破自我!💡 阅读详情

参考文章:原文链接

事务隔离级别:

隔离级别所要解决的问题是在应用程序中,存在多个事务同时在运行时,需要解决和处理好的问题!
脏读(dirty read)  
         一个事物更新了数据库中的某些数据,另一个事物读取了这些数据,这时前一个事物由于某些原因回滚了,那么第二个事物读取的数据就是“脏数据” 
不可重复读(non-repeatable read)
         一个事物两次查询同一数据,但两次查询中间可能有另外一个事物更改了这个数据,导致前一个事物两次读出的数据不一致。
幻读 (phantom read)
         一个事物两次查询同一个表,但两次查询中间可能有另外一个事物又向这个表中插入了一些新数据,导致前一个事物的两次查询不一致  



Spring中@Transactional中Isolation有具备的值:

 DEFAULT  使用各个数据库默认的隔离级别
 Read Uncommited :读未提交数据( 会出现脏读,不可重复读,幻读)
 Read Commited :读已提交的数据(会出现不可重复读,幻读)
 Repeatable Read :可重复读(会出现幻读)
 Serializable :串行化

注意:
如果开启了bin-log日志,配置Read Uncommited或者Read Commited会报错:
Caused by: java.sql.SQLException: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT 
and at least one table uses a storage engine limited to row-based logging. 
InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

原因:mysql默认的binlog_format是STATEMENT,而在READ COMMITTED或READ UNCOMMITTED隔离级别下,innodb只能使用的binlog_format是ROW



事务的配置:

web.xml中:

<!-- Spring为我们提供的OpenSessionInViewFilter过滤器,主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定
		目的是为了实现"Open Session in View"的模式。例如: 它允许在事务提交之后延迟加载显示所需要的对象-->
<filter>
	<filter-name>Spring OpenSessionInViewFilter</filter-name>
	<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
	<init-param>
		<!-- 指定org.springframework.orm.hibernate3.LocalSessionFactoryBean在spring配置文件中的名称,默认值为sessionFactory 
			如果LocalSessionFactoryBean在spring中的名称不是sessionFactory,该参数一定要指定,否则会出现找不到sessionFactory的例外 -->
		<param-name>sessionFactoryBeanName</param-name>
		<param-value>sessionFactory</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>Spring OpenSessionInViewFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

ApplicationContext.xml配置:

<!-- =============================== 事务管理 ================================== -->
<!--配置事务管理器-->  
<bean id ="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">  
    <!-- 注入sessionFactory-->  
    <property name="sessionFactory" ref="sessionFactory"></property>  
</bean>

<!--开启事务注解-->  
<tx:annotation-driven transaction-manager="transactionManager"/>


重点以及感悟:

1、使用误区:
无论在service层或者dao层调用,session对象获得都是sessionFactory.getCurrentSession();
userDao调用不同的方法,如:userDao.save(user);   userDao.update(user);  用到的session对象是同一个(得到的session用hashcode打印出来,可以看出是一个对象)

事务起不起作用,一个注意点:
用@Transaction的方法必须抛出运行时异常。这样方法里面的代码才可能被回滚。
如果方面里面被try catch处理了,将不能抛出异常,那么即使有运行时异常也被catch处理了,所以就不能回滚了,

错误实例:

@Transactional
@Override
public void batchAdd() throws Exception {
	try {
		User user = new User();
		user.setName("dhh");
		user.setPassword("xxxxxx");
		user.setSex("男");
		user.setTimetag(new Date());
		
		this.save(user);  //写库处理,和下面的逻辑要事务处理
		
		Thread.sleep(5000);
		
		int i = 5/0;  //另外的写库处理,模拟异常
		System.out.println(i);
	} catch (Exception e) {    //异常被catch了,不能抛出异常,将不能回滚
		e.printStackTrace();
		
	}
}

个人思路:事务操作最好放到dao层处理,异常集中到service层处理,所以service最好别抛抛异常给controller


2、@Transactional之value
value这里主要用来指定不同的事务管理器;主要用来满足在同一个系统中,存在不同的事务管理器。
比如在Spring中,声明了两种事务管理器txManager1, txManager2.

然后,用户可以根据这个参数来根据需要指定特定的txManager.

 那有同学会问什么情况下会存在多个事务管理器的情况呢? 
 比如在一个系统中,需要访问多个数据源或者多个数据库,则必然会配置多个事务管理器的。


3、Propagation支持7种不同的传播机制:
REQUIRED
     业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为.。 

SUPPORTS:  
     如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。
 MANDATORY:
     只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常
 REQUIRES_NEW
     业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行.
 NOT_SUPPORTED
     声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行.

NEVER:
     声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常.只有没关联到事务,才正常执行.
 NESTED:
     如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动的事务,则按REQUIRED属性执行.它使用了一个单独的事务, 
     这个事务拥有多个可以回滚的保证点.内部事务回滚不会对外部事务造成影响, 它只对DataSourceTransactionManager 事务管理器起效.


3、使用范围:
@Transactional写在类前,那么所有的方法,都具有事务特性,
如果某个方法不需要propagation=Propagation.NOT_SUPPORTED

@Transactional(value="transactionManager",propagation=Propagation.NOT_SUPPORTED,isolation=Isolation.REPEATABLE_READ)
@Override
public void batchAdd() throws Exception {
}

具体Transaction有哪些参数,以及值怎么填写,打开源码就一清二楚了!!!


4、想法验证:
我之前想在dao的基类中定义@Repository
那么继承这个基类的dao方法都继承这个变量,经过检验,是行不通的
同理,在接口上定义@Repository
也是行不通的

掌握Spring+MyBatis的声明式事务管理 在现代的软件开发中,事务管理是保证数据一致性和业务逻辑正确执行的核心机制之一。本章将深入浅出地介绍Spring框架下事务管理的概念,为读者提供一个全面的概览,并为后续章节中将要深入探讨的声明式和编程式事务管理打下坚实的基础。事务是数据库管理系统执行过程中的一个逻辑单位,由一系列的操作组成,这些操作要么全部成功,要么全部失败。在应用程序中,事务的主要作用是确保数据的一致性和完整性。在IT领域,特别是在金融、电子商务以及需要可靠数据一致性的任何系统中,事务的使用至关重要。 阅读详情

相关推荐

Spring @Transactional工作原理详解

主要介绍了Spring @Transactional工作原理详解,具有一定借鉴价值,需要的朋友可以参考下。

@Transactional详解

@Transactional的概述 是Spring框架中声明式事务管理 编程中使用的注解 添加的位置 使用在接口的实现类上或接口的实现方法上,不是接口类中 @Transactional注解只能引用到public方法上,这是由Spring AOP的本质决定的,如果你在protected、private或者默认可见性的方法上使用@Transactional注解,那是无效的 系统设计:将@Transactional标签放在需要进行事务管理的方法上,而不是不假思索的放置在接口实现类上,(接口中所有方

天元白手的博客 2445

Proteus仿真实战:用AT89C51+L298N搭建直流电机PID调速系统(附完整工程文件)

本文详细介绍了使用Proteus仿真平台结合AT89C51单片机和L298N驱动模块搭建直流电机PID闭环调速系统的全过程。从硬件选型、电路连接到PID算法实现与参数整定,提供了完整的开发指南和工程文件,帮助读者快速掌握闭环调速系统的设计与调试技巧。

weixin_28724661的博客 448

【事务】@Transactional 注解参数详解

通过本篇学习,你将加深对 @Transactional 注解以及所有的属性的理解,还可以学习到 @Transactional 注解常见的失效场景。@Target({ElementType.TYPE, ElementType.METHOD}):设定注解使用范围是类和方法上;@Retention(RetentionPolicy.RUNTIME):设定生命周期为全周期,支持使用反射机制的代码读取和使用;@Inherited:指明如果该注解修饰的父类被子类继承,那么子类也具备事务特性;

DreamSun的博客 7547

基于ZYNQ7020芯片(黑金开发板AX7020)之AXI-FULL DDR的PL与PS交互操作。

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断。此测试工程得到以前知识的总结和各大网友的支持,只希望可以为学习的你更进一步,大家一起学习才是真的开心。加油,国产芯片之路。

landyjzlai的博客 3190

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

@Transaction

事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。 SpringMVC中的事务注解 @Transactional就是为了方法执行中的对数据库操作事务的完整性做的,要么方法全部执行成功,所有sql语句全部正确执行,要么全部不做,就是这样。 spring的事物管理,一般加在service类上。也可以加在service中的方法上,有参数可选择,如...

光亮 2551

FPGA新手必看:用USB转TTL实现串口通信的完整流程(附CH340G电路详解)

本文为FPGA新手提供了通过USB转TTL模块实现串口通信的完整实战指南。详细解析了CH340G电路设计要点、硬件连接方法,并分享了经过验证的Verilog代码框架,帮助读者快速掌握FPGA与PC通信的核心技术,解决电平匹配与波特率设置等常见问题。

cake8的博客 1049

【数据库学习】事务及Spring事务机制:@Transactional

1,Spring中的Transacational spring 中的 @Transactional 基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题。 1)原理 在应用系统调用声明了 @Transactional 的目标方法时,Spring默认使用AOP代理,在代码运行时生成一个代理对象,如右图中所示调用者Caller并不是直接调用的目标类上的目标方法(Target Method),而是调用的代理类(AOP Proxy)。 根据 @Transactional 的属性配置信息,

午后阳光 5206

基于Multisim设计电子密码锁

一、设计任务与要求:(可软件仿真实现)1)基本要求:设计一个数字密码锁,要求只有按正确的顺序,输入正确的密码,方能输出开锁信号,实现开锁。设置三个正确的密码键和若干个伪键,任何伪键按下后,密码锁都无法打开。每次只能接受四次按键信号,而且第四个键只能是“确定”或者“重输键”,其他无效。能显示已输入键的个数2)扩展要求:第一次密码输错后,可以输入第二次,但是连续三次输错,密码将被锁,必须按复位键才能解锁。

ablinger的博客 4417

74、光谱成像在电子内窥镜及色彩理论中的应用

本文探讨了光谱成像在电子内窥镜中的应用及其与色彩理论的深度融合。通过分析FICE技术、色彩再现模型及胃黏膜光谱测量,展示了光谱信息在提升医学诊断准确性方面的潜力。同时,系统阐述了颜色的物理属性、标准表示方法、同色异谱现象、颜色测量技术(密度法与比色法)以及CIELAB等均匀颜色空间的构建原理。结合流程图与对比表格,梳理了从光信号获取到颜色处理的完整路径,并展望了人工智能与新型视觉模型在未来医疗成像与色彩科学中的发展方向。

g2h3i4j5的博客 152

spring之@Transactional 简介

// 源码 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager

wy 1549

PCL 最小生成树用于法向量定向【2025最新版】

PCL 最小代价生成树用于点云法向量的定向。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2067

Spring Boot事务管理:注解配置与性能优化实践

事务管理是确保数据一致性的关键技术,在Java企业级开发中尤为重要。Spring Boot通过声明式事务管理简化了实现,主要基于@Transactional注解和AOP代理机制。理解事务传播行为和隔离级别是掌握Spring事务的核心,其中传播行为定义了方法间的事务交互方式,隔离级别则控制并发访问的数据可见性。在实际工程中,合理配置事务属性如timeout和readOnly能显著提升性能,而避免同类方法调用等常见陷阱则能确保事务生效。结合分布式事务方案如TCC和本地消息表,Spring事务能有效应对微服务架构

weixin_30861459的博客 425

群晖如何安装软路由OpenWrt/iStoreOS作为旁路由(含网络设置、设置密码、还原出厂设置等linux命令ipk包)

openwrt的固件。

XiaoqiangClub的博客 7017

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring 注解

Spring 注解是 Spring 框架中用于简化配置、实现依赖注入(DI)和控制反转(IoC)的核心机制。通过注解,开发者可以直接在 Java 类或方法上声明 Bean、依赖关系、事务管理等功能,无需依赖 XML 配置。

yuren_xia的博客 896

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Spring-tx声明式事务、@Transaction注解事务

转载自http://jinnianshilongnian.iteye.com/blog/14423769.4  声明式事务9.4.1  声明式事务概述       从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量。       本节将介绍声明式事务支持,使用该方式后最大的获益是简单,事务管理不再是令人痛苦的,而且此方式属于无侵入式,对业务逻辑实现无影响。...

weixin_39214481的博客 8003

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring事务注解配置

一,spring基于注解式的事务配置方法:@Transactional 1.xml配置&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSche...

anyeoo的博客 3296

Spring中的事务是如何实现的

可以在注解中指定传播行为、隔离级别、超时和回滚规则等属性。@Service// 执行数据库操作​​。

w13707470416的博客 999

深入理解Spring事务管理:@Transactional注解全方位解析

‌最小化原则‌:事务范围仅包含必要操作异常处理‌:统一使用RuntimeException体系性能监控‌:集成Micrometer+Prometheus‌版本适配‌:Spring 6.x推荐使用JTA 2.0+‌测试验证‌:使用@TransactionalTest进行集成测试阅读建议Spring官方事务文档所有示例均通过Spring 6.2+验证,完整代码可参考Spring官方事务示例库。

weixin_42593797的博客 1905

Spring中@Transactional事务回滚

一、Spring 默认事务 Spring中@Transactional事务,默认情况下只对 RuntimeException 回滚。 即: 如果被注解的数据库操作方法中发生了unchecked异常(RuntimeException),所有的数据库操作将rollback; 如果发生的异常是checked异常(Exception),默认情况下数据库操作还是会提交的。 也就是说,默认情况下,如果程序............

猎人在吃肉 2万+

Spring事务使用

Spring事务 一、Spring的事务管理 ​ 事务原本是数据库中的概念,在Dao层。但一般情况下,需要将事务提升到业务层,即Service层。这样做是为了能够使用事务的特性来管理具体的业务。 ​ 在Spring中通常可以通过以下两种方式来实现对事务的管理 使用Spring 的事务注解管理事务 使用AspectJ 的AOP配置管理事务 二、Spring事务管理API ​ Spring的事务管理,主要用到两个事务相关的接口 1、事务管理器接口(重点) ​ 事务管理器是PlatformTransa

qq_45979254的博客 1031

【第九章】 Spring的事务 之 9.4 声明式事务 ——跟我学spring3

转自:http://sishuok.com/forum/blogPost/list/2508.html 9.4  声明式事务 9.4.1  声明式事务概述        从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量。        本节将介绍声明式事务支持,使用该方式后最大的获益是简单,事务管理不再是令人痛苦的,而且此方式属于

编程猫的博客 313

Spring JDBC与事务管理8:Spring声明式事务三:【注解形式】配置声明式事务;

说明: (1)同理,Spring这个机构,也提供了【使用注解方式,配置声明式事务】的策略; (2) 一:初始代码:创建项目s03;(这儿不是本篇博客的核心,快速浏览就行。) ...

小枯林的博客 493
上一篇: mysql-processlist 显示进程列表
下一篇: gbk文件==>utf-8 小工具
wive
博客等级 码龄14年 33粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值