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

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题

1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con...

weixin_42304393的博客 2万+

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

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

DreamSun的博客 7547

TCN(Temporal Convolutional Networks)时序卷积网络详解及代码

TCN(Temporal Convolutional Networks)时序卷积网络详解及代码

zhulewen的博客 7883

WVP-GB28181-Pro配置避坑指南:从零到上线全流程详解(含ZLM自动同步技巧)

本文详细解析了WVP-GB28181-Pro视频平台的配置流程,特别针对国标视频平台部署中的常见陷阱,如stream-ip/sdp-ip配置错误、ZLM自动同步问题及端口冲突等,提供了实用的解决方案和优化建议,帮助开发者快速实现从零到上线的全流程部署。

weixin_30836759的博客 93

@Transaction

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

光亮 2551

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3182

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

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

午后阳光 5206

Python控制LitePoint IQxel-MW 无线网络测试仪

由于项目需要进行WIFI和BT(蓝牙)的射频测试,所以需要开发一款支持WIFI/BT射频测试的工具。开发射频测试工具的话那肯定离不开仪表的控制。我们项目用的就Litepoint的IQxel-MW无线网络测试仪。这篇文章主要就是介绍一下如何控制仪表以及实现的过程!LitePoint是美国硅谷的一家仪器厂商,主要做一些无线通讯测试仪表,包括WIFI,BT(Bluetooth),LTE等等。

xgh1951的博客 1万+

两点调制原理以及RF DAC和PLL SDM两条输入路径理解

特性数据本质原始数字比特流 (0/1)平滑后的预失真波形数据连接对象Σ-Δ调制器 (SDM)的小数输入RF DAC在系统中的角色主调制路径:通过改变PLL分频比产生频率偏移辅助补偿路径:通过RF DAC产生补偿电压,校正PLL失真可否加入延时可以且必须。用于数字时序对齐,对性能无影响。绝对不可以。会导致补偿失配,严重破坏信号频谱。功能目标实现数字域的频率调制确保模拟域的波形和频谱完美因此,在您所描述的这种先进发射机架构中,2-point数据是数字指令,送给SDM;

m0_49540263的博客 604

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

基于STM32的智能婴儿床控制系统设计(手机APP+蓝牙无线控制)(210)

项目充分运用先进的嵌入式技术和物联网理念,打造出一款集安全性、便利性、舒适性于一体的智能婴儿床控制系统,旨在减轻育儿负担,提高育儿效率,保障婴幼儿健康成长,满足现代家庭对高品质育儿生活的追求。

3478

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

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

weixin_30861459的博客 425

4、LTE无人机认证:保障通信安全的新方案

本文针对LTE网络中无人机通信存在的安全风险,提出了一种基于可信第三方GCS的新型认证协议。该协议通过非对称加密和哈希函数保护IMSI等敏感信息,防止身份泄露、中间人攻击、拒绝服务攻击和位置追踪等威胁。利用Scyther工具对协议进行形式化分析,验证了其在机密性、一致性和活性等方面的安全属性,证明该方案能有效提升无人机在LTE网络中的通信安全性与隐私保护能力。

pink的博客 60

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring 注解

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

yuren_xia的博客 896

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

weixin_39214481的博客 8003

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值