spring 注解 事务

手写spring事务注解 微信公众号:用心程序员 介绍 手写spring事务注解,意思是自定义**@ExtTransactional注解,实现类似spring自带注解@Transactional**一样的功能 一、Java自定义注解 注解是Jdk1.5新增新技术。很多框架为了简化代码,都会提供一些注解。注解可以理解为插件,是代码级别的插件,不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。 ###Java提供了三... 阅读详情

第一步:引入<tx:>命名空间 ,在spring的配置文件中修改, beans根元素里多了三行,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

第二步:在spring的配置文件中修改,将所有具有@Transactional 注解的bean自动配置为声明式事务支持

<!--JDBC事务管理器,根据你的情况使用不同的事务管理器,如果工程中有Hibernate,就用Hibernate的事务管理器 -->	
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
</bean>	
		
<!-- 用注解来实现事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

第三步: 在接口或类的声明处 ,写一个@Transactional. 要是只的接口上写, 接口的实现类就会继承下来.

接口的实现类的具体方法,还可以覆盖类声明处的设置.


@Transactional
public class TestPOAOImpl extends POAOBase implements TestPOAO
{	
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void test1()
	{
		String sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解赵云',30)";
		execute(sql);


		sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解张飞',26)";
		execute(sql);


		int a = 9 / 0; //异常


		sql = "INSERT INTO sy_test (NAME,AGE) VALUES('注解关羽',33)";
		execute(sql);
		System.out.println("走完了");
	}
//execute() 方法略...
}

注意的几点:

1  @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

 

2 默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 .  遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .


Spring事务的传播属性 

 

REQUIRED业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为.
SUPPORTS如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行.
MANDATORY只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常
REQUIRES_NEW业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行.
NOT_SUPPORTED声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行.
NEVER声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常.只有没关联到事务,才正常执行.
NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动的事务,则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保证点.内部事务回滚不会对外部事务造成影响, 它只对DataSourceTransactionManager 事务管理器起效.

 .

 

数据库事务的隔离级别 

 

数据库提供了四种事务隔离级别, 不同的隔离级别采用不同的锁类开来实现.在四种隔离级别中, Serializable的级别最高, Read Uncommited级别最低.大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle.少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎.

 


1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 
     另外四个与JDBC的隔离级别相对应 
2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 
     这种隔离级别会产生脏读,不可重复读和幻像读。 
3. ISOLATION_READ_COMMITTED : 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 
4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 
     它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 
5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 
     除了防止脏读,不可重复读外,还避免了幻像读。

 

  • Read Uncommited :读未提交数据( 会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新 )
  • Read Commited :读已提交的数据(会出现不可重复读,幻读)
  • Repeatable Read :可重复读(会出现幻读)
  • Serializable :串行化

 

丢失更新   : 
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。   
例:
事务A和事务B同时修改某行的值,
1.事务A将数值改为1并提交
2.事务B将数值改为2并提交。
这时数据的值为2,事务A所做的更新将会丢失。 
解决办法:对行加锁,只允许并发一个更新事务。

 

脏读: 

一个事务读到另一个事务未提交的更新数据

例:

1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)         
2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000, 像这样,Mary记取的工资数8000是一个脏数据。

 

不可重复读: 

在同一个事务中,多次读取同一数据,返回的结果有所不同. 换句话说就是,后续读取可以读到另一个事务已提交的更新数据. 相反"可重复读"在同一事务多次读取数据时,能够保证所读数据一样,也就是后续读取不能读到另一事务已提交的更新数据.

例:

1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

 

幻读: 

一个事务读取到另一个事务已提交的insert数据.

例:

第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时 (此时第一事务还未提交) ,第二个事务向表中插入一行新数据。这时第一个事务再去读取表时,发现表中还有没有修改的数据行,就好象发生了幻觉一样。



Spring 事务详解(注解方式) 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功,只有这两种情况。@Transactional注解 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。虽然@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。 阅读详情

相关推荐

Spring事务及其注解

Spring事务及其注解目录页Spring事务相关Spring事务的表达方式Spring事务的原理本质Spring和事务的关系Spring事务三要素事务的传播特性事务常出现的问题事务的隔离级别事务超时事务的只读属性事务的回滚规则Spring事务的注解配置事务注解的本质Spring声明式事务实现原理AOP与AspectJ的区别:Spring事务加载过程: Spring事务相关 Spring事务是Spring框架中的重要知识点,本文只是对之前秋招的学习成果进行简单总结。 Spring事务的表达方式 sprin

hjukyjhg56的博客 1945

Spring的事务传播属性,数据库的隔离级别

Spring事务的传播属性    REQUIRED 业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为. SUPPORTS 如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行. MANDATORY 只能在一个已...

SiC B2B2C Shop大型B2B2C商城软件产品,使用Java语言开发,高性能高扩展性高安全性分布式。可帮助你快速的建立大型B2B2C电商系统 343

Spring事务核心:声明式事务&注解式事务

在Spring中,事务管理是一个非常重要的特性,它可以帮助开发者在应用程序中实现事务控制。Spring提供了两种事务管理方式:声明式事务和注解事务。

five-five 1743

SSM/springBoot代码生成器——新增全局事务切面,logback日志支持,SSM框架支持

目录 小记 新增全局事务 logback日志支持 SSM框架支持 运行效果 小记 这两天比较清闲,对生成器做了进一步的优化与更新,一起来看一下吧! 新增全局事务 相信我们都知道事务在数据操作的过程当中十分重要,举个最简单的例子,如果程序正在处理添加数据的业务,但是程序执行完sql之后的业务流程中产生了异常,这个时候应该回滚,则添加数据无效,保证了业务的统一和数据的完整。一般...

小螺旋丸的博客 1570

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4816

mobaXterm连接vmWare虚拟机上的centOS7提示连接失败的解决方法

1.问题描述: mobaXterm安装后连接虚拟机vmWare上的centOS7发现连接不上,如下图所示: 2.解决方法 先是查了一下centOS的ip 开始错误的以为 virbr0: 后面的inet就是虚拟机的IP 实则不然(正确的ip是在ens33后面的inet中的ip,大佬们勿喷) 这个值需要配置一下的,具体配置过程如下: step1: 进入centOS下的/...

hss19214的博客 7890

spring事务传递机制原理

首先,我们通过org.springframework.transaction.annotation.Propagation来了解一下spring事务的传播定义: 0、REQUIRED(默认): Support a current transaction, create a new one if none exists. 支持当前事务,如果没有则创建一个新的 1、SUPPORTS Support a current transaction, execute non-transact

s_156的博客 973

Conda安装cuda指定版本遇到的一个大坑,导致pytorch无法使用cuda且nvcc -V显示错误的cuda版本

24年3月份的时候用conda install nvidia/label/cuda-11.x.x::cuda还挺正常的,能直接安装11.x.x版本的cuda,我还安利给同学用。但现在5月份不知道为什么这些命令都只会安装最新的cuda12.4,不知道是我哪里设置有问题还是官网的安装目录里的环境配置换了?我在三台不同的服务器上都尝试了安装不同版本的cuda,但最后安装下来的都是12.4版本。

weixin_43933424的博客 8892

spring事务隔离

2.不可重复读(Non-repeatable Read): 不可重复读指的是在一个事务内,对同一行数据进行多次读取,但得到的结果不一致。3.幻读(Phantom Read): 幻读指的是在一个事务内,多次查询某个范围的数据时,得到的结果集不一致。事务A完成查询后,事务B插入商品。总之,可重复读隔离级别通过锁机制和多版本并发控制来确保在一个事务的生命周期内,同一行数据的多次读取结果是一致的,即使该数据在事务进行过程中被其他事务修改。在该隔离级别下,事务保证在同一个事务内多次读取同一行数据时,得到的结果一致。

weixin_41812346的博客 1072

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2100

Oracle Linux中/var/log/pcp/pmlogger目录膨胀问题分析与解决

本文详细分析了Oracle Linux系统中/var/log/pcp/pmlogger目录异常膨胀的常见原因与解决方案。当PCP性能监控框架的pmlogger服务日志轮转或清理机制失效时,会导致该目录无限增长,威胁系统稳定。文章提供了从服务状态诊断、配置文件审查到安全清理与预防策略的全流程实战指南,帮助运维人员快速回收磁盘空间并恢复服务正常运行。

weixin_29208327的博客 372

springboot 全局事物

1. pom  &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-aop&lt;/artifactId&gt; &lt;/dependency&gt; 2. TransactionAdviceCo...

莫失莫忘的博客 871

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别?

下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议

sendws的博客 3875

Spring是如何管理事务的之@Transactional注解详解

如果想要方法 1 和方法 2 均单独保持事务一致性怎么办呢,刚说过了,如果不是用代理调用 @Transactional 注解是不生效的,所以一定要使用代理调用实现,然后让方法 1 和方法 2 分别单独开启新的事务,便 OK 啦。第一点要注意的就是在 @Transactional 注解的方法中,再调用本类中的其他方法 method2 时,那么 method2 方法上的 @Transactional 注解是不!答案是结果和上面是一致的。通过代理对象在目标对象前后进行方法增强,也就是事务的开启提交和回滚。

weixin_43439425的博客 2427

STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)

单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片唤醒驱动程序。 一、RxDutyCycle模式 在讲述本篇内容之前,我们先来看一下SX1268的一种模式RxDutyCycle,译为中文为接收占空比模式。其可使用SetRxDutyCycle命令进入RxDutyCycle模式,我们来看一下该命令的详细解释。 该命令具有2个参数,...

snmplink的博客 4068

实战|基于Kappa架构的用户行为实时分析平台搭建教程

数据源:用Kafka存储全量数据(实时+历史),作为“事实来源”;处理引擎:用Flink等流处理引擎,读取Kafka中的数据,执行清洗、转换、聚合等操作;存储层:将处理结果写入实时存储(如Elasticsearch)或批量存储(如Hive);消费层:用可视化工具(如Kibana)展示结果,或提供API供业务系统调用。Kappa架构的关键设计原则全量数据存于Kafka:Kafka的“无限 retention”特性(默认保留7天,可配置更长)让它成为全量数据的存储介质;用流处理引擎处理所有数据。

Java大师兄的博客 797

spring 的事务注解

知识点: 1.同一个类的(没有@Transactional注解)A方法调用B方法,(有@Transactional注解)B方法的事务无效。 2.A类的B方法调用C类的D方法,那么D方法的事务是有效的。(这里的B方法没有注解,D方法有注解) 解决注解失效的方法: @Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口、类、类方法。 作用于类:当把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。 作用

范文聪 2210

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spring——事务注解@Transactional【建议收藏】

下面介绍@Transctional的用法,包括:注解参数设置,事务方法调用的几种不同case,事务如何回滚,常见的事务失效的场景以及使用建议;

GitHub质检员 6048

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二、Spring注解事务原理

目录前言:一、Spring注解事务二、JDK注解三、自定义注解 前言: 本篇先介绍Srping注解事务的使用 其次介绍下JDK中注解以及自定义注解的使用 最后手动编写代码实现Spring注解事务并解决线程安全问题 一、Spring注解事务 1.pom依赖 <dependencies> <!-- 引入Spring-AOP等相关Jar --> <dependency> <groupId>org.springframework</gro

qq23001186的博客 819

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Spring】事务和@Transactional注解

Spring事务和@Transactional详解

啊松同学的博客 2467

Spring事务注解

spring注解事务特性介绍,失效场景总结

严文文 Chris 8969

spring 事务注解式事务

1.上一章,我们谈到了spring+mybatis声明式事务管理,我们在文章末尾提到,在实际项目中,用得更多的是注解式事务管理,这一章将学习一下注解式事务管理的有关知识.注解式事务管理只需要在上一节的小实例上更改两个文件就好: (1)更改spring配置文件applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?>...

小明的博客 1327

【Spring 篇】基于注解的Spring事务控制详解

在我们踏入事务控制的舞台之前,让我们先来了解一下什么是事务。简而言之,事务是一系列操作,要么全部成功执行,要么全部失败回滚。这就好比你在玩电子游戏,要么通关,要么回到起点重新来过。在软件开发中,事务确保了数据的完整性和一致性,是我们保持代码健壮性的重要手段。通过这篇博客,我们深入浅出地探讨了基于注解的Spring事务控制。从事务的概念开始,逐步介绍了注解、事务的传播行为、隔离级别、超时设置、回滚控制、以及一些常见的使用场景。通过生动的小故事和实际的代码示例,相信你对Spring事务管理有了更加深刻的理解。

繁依Fanyi的博客 1610

spring事务注解的解释

spring事务注解的解释 配置类中的注解 @Configuration @ComponentScan(basePackages = "com.ni") @Import({JdbcConfig.class,TransactionConfig.class}) @PropertySource("Jdbc.properties") //开启事务注解 @EnableTransactionManagement public class SpringConfiguration { } 业务层中的注解 @Servic

weixin_42245712的博客 239

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的博客 3298

Spring事务常用注解

文章目录Spring事务常用注解1. @EnableTransactionMannagement1.1 作用1.2 属性分析2. @Transactional2.1 作用2.2 属性分析3. @TransactionEventListener3.1 作用3.2 属性分析 Spring事务常用注解 1. @EnableTransactionMannagement 1.1 作用 表示spring开启注解事务配置的支持 1.2 属性分析 @Target(ElementType.TYPE) @Retention(

qq_29942585的博客 3413
上一篇: spring 注解 aop
下一篇: 高数基础
mllhxn
博客等级 码龄14年 116粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值