框架(三)Spring框架之Spring的事务管理

Spring Framework框架(一) Spring Framework框架 一、Spring概述 1.spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java 阅读详情

1.事务的基础知识

1.1事务的特性:
原子性:事务不可分割
一致性:事务执行前后数据完整性保持一致
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:一个事务结束后,数据就持久化到数据库
1.2不考虑隔离性引发的安全问题
++++读问题:
脏读------------一个事务读到另一个事务未提交的数据
不可重复读—一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
幻读------------一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致
+++++写问题:
丢失更新
1.3解决读的问题:
++++设置事务隔离级别
Read uncommitted(未提交读):任何读问题都解决不了;={}
Read committed(已提交读):解决脏读,无法解决不可重复读和幻读;
={orancle默认}
Repeatable read(重复度):解决脏读和不可重复读,无法解决幻读;
==={mysql默认}
Serializable:解决所有读问题;

2.Spring事务管理的API

2.1Spring 的事务传播行为==========>>>>解决特别复杂的业务方法之间的调用
===2.1.1.保证多个操作在同一个事务中【一般使用默认的】
====PROPAGATION REQUIRED :默认值,如果A中有事务,使用A中的事务;如果A中没有事务,则创建一个新的事务,将操作包含进来;
2.1.2.保证多个操作不在同一个事务中
====PROPAGATION REQUIRES NEW : 如果A中有事务,将A的事务挂起(暂停),创建新的事务,只包含自身操作;如果A中没有事务,创建一个新事务,包含自身操作;
2.1.3.嵌套式事务
====PROPAGATION NESTED:嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作;如果没有异常,执行通过,若有异常可以选择回滚到最初始位置,也可以回滚到保存点

3.Spring事务管理的认识====模拟转账【未涉及事务】

3.1搭建Spring事务管理环境
1.引入必要的Jar包;
jdbc.properties的配置

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_1
jdbc.username=root
jdbc.password=123456

创建Service接口与实现
创建Dao的接口与实现
配置Service和Dao,交给Spring管理

/**
 * @author Leonard
 *	转账的业务层接口
 */
public interface AccountService {
	public void transfer(String from,String to,Double money);
}
/**
 * @author Leonard
 *	转账的业务层实现======无事务控制,出现异常,转账出现错误
 */
public class AccountServiceImpl implements AccountService {
	//1.注入Dao
	private AccountDao accountDao;

	public void setAccountDao(AccountDao accountDao) {
		this.accountDao = accountDao;
	}

	@Override
	public void transfer(String from, String to, Double money) {
		accountDao.outMoney(from, money);//扣钱
		int b=1/0;//=================转账异常,程序终止
		accountDao.inMoney(to, money);//未收到钱
	}
}
/**
 * @author Leonard
 *	转账的Dao接口
 */
public interface AccountDao {
	/**
	 * @param from转出=========-钱
	 * @param money
	 */
	public void outMoney(String from,Double money);
	
	/**
	 * @param to转入=======+钱
	 * @param money
	 */
	public void inMoney(String to,Double money);
}

/**
 * @author Leonard
 *	Dao的实现类
 */
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {

	/* (non-Javadoc)
	 * 转账扣钱
	 */
	@Override
	public void outMoney(String from, Double money) {
		this.getJdbcTemplate().update("update account set money=money-? where name=?" , money,from);
	}

	/* (non-Javadoc)
	 *	转账收钱
	 */
	@Override
	public void inMoney(String to, Double money) {
		this.getJdbcTemplate().update("update account set money=money+? where name=?", money,to);
	}

}

2.在xml中配置Service和Dao以及JDBC模板,交给Spring管理

<!--  配置Service -->
      <bean id="accountService" class="spring.tx.demo.AccountServiceImpl">
            <property name="accountDao" ref="accountDao"/>
      </bean>
      <!-- 配置Dao -->
      <bean id="accountDao" class="spring.tx.demo.AccountDaoImpl">
        <!-- 直接给Dao一个连接池即可 -->
            <property name="dataSource" ref="datasource"></property>
      </bean>
      <!-- 1.引入配置文件 -->
      <context:property-placeholder location="classpath:jdbc.properties"/>
      <!-- 2.引入相应的值 -->
      <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${jdbc.driverClass}"/>
            <property name="jdbcUrl" value="${jdbc.url}"/>
            <property name="user" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
      </bean>

3.创建测试类操作数据库–模拟转账

/**
 * @author Leonard
 *	转账环境测试
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:tx.xml")
public class AccountTest {
	//创建业务层的类
	@Resource(name="accountService")
	private AccountService accountService;
	@Test
	public void demo(){
		accountService.transfer("bbb", "ccc", 100000d);
	}
}

4.Spring事务管理===第一类:编程式事务【了解】

1.配置平台事务管理器和事务管理模板类

<!--  配置平台事务管理器 -->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="datasource"></property>
      </bean>
 <!-- 配置事务管理模板 -->
      <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
            <property name="transactionManager" ref="transactionManager"/>
      </bean>

2.在业务层注入事务管理模板

<!--  配置Service -->
<bean id="accountService" class="spring.tx.demo.AccountServiceImpl">
      <property name="accountDao" ref="accountDao"/>
      <!-- 注入事务管理模板 -->
      <property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>

3.编写事务管理代码【了解】
对第三节中模拟转账中业务层实现进行升级,防止出现异常导致转账错误

/**
 * @author Leonard
 *	转账的业务层实现
 */
public class AccountServiceImpl implements AccountService {
	//1.注入Dao
	private AccountDao accountDao;

	public void setAccountDao(AccountDao accountDao) {
		this.accountDao = accountDao;
	}
	//2.注入事务管理的模板
	private TransactionTemplate transactionTemplate;

	public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
		this.transactionTemplate = transactionTemplate;
	}


	@Override
	public void transfer(final String from, final String to, final Double money) {
		transactionTemplate.execute(new TransactionCallbackWithoutResult() {//事务控制,出现异常,则不会转账成功
			
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
				accountDao.outMoney(from, money);
				int d = 1/0;//=========异常,事务回滚
				accountDao.inMoney(to, money);
			}
		});
	}
}

5.【重点】Spring事务管理===第二类:声明式事务管理(通过配置实现)–AOP思想

5.1xml方式
1.引入必要的jar
在这里插入图片描述
2.配置事务管理器和配置增强

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"></property>
</bean>
<!--  配置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
       <tx:method name="transfer" propagation="REQUIRED"/>/*====为某个方法添加事务======*/
   </tx:attributes>
</tx:advice>

3.AOP配置

<!-- AOP配置 -->
<aop:config>
        <aop:pointcut expression="execution(* spring.tx.demo2.spring.tx.demo2.AccountServiceImpl.*(..))" id="pointcut1"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>

5.2注解方式===tx3.xml
1.配置事务管理器

<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="datasource"></property>
</bean>

2.开启注解事务

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

3.在业务层添加事务注解-----@Transactional
@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)也可以添加隔离级别和传播行为

//添加注解
@Transactional
public class AccountServiceImpl implements AccountService {
	//1.注入Dao
	private AccountDao accountDao;

	public void setAccountDao(AccountDao accountDao) {
		this.accountDao = accountDao;
	}
	@Override
	public void transfer(String from, String to, Double money) {
				accountDao.outMoney(from, money);
				int d = 1/0;//若没有事务控制会出现扣款成功,转账失败情况
				accountDao.inMoney(to, money);
			}
}

4.测试类测试,查询数据库前后对比

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:tx3.xml")
public class AccountTest {
	//创建业务层的类
	@Resource(name="accountService")
	private AccountService accountService;
	@Test
	public void demo(){
		accountService.transfer("bbb", "李四", 10000d);
	}
}
Spring、SpringMVC、Hibernate框架集成实战 本文还有配套的精品资源,点击获取 简介:Spring、SpringMVC和Hibernate是Java开发中常用的三大框架,它们协同工作以构建Web应用程序。本课程设计项目实战将深入探讨这三个框架的核心概念,包括Spring的DI和AOP、SpringMVC的MVC设计模式、Hibernate的ORM功能。学生将通过实践任务,掌握这些框架的整合使用,包括配置Spring容器... 阅读详情

相关推荐

resthub-spring-stack:RESThub Spring堆栈

基于Spring 3.2,Jackson 2,LogBack,TestNG,Fest Assert 2.x和Mockito的RESThub Spring堆栈 在查看文档,教程和示例 Javadoc可用。 在Travis CI上的构建状态:

Spring框架详细解析(上手操作的小白版)

Spring框架是一个,由Rod Johnson创建并于2004年首次发布。Spring框架通过(Inversion of Control,控制反转)和(Aspect Oriented Programming,面向切面编程)等技术为企业级应用提供了全面的编程和配置的支持,使得JavaEE开发更加容易、高效、优雅。,包括:在Spring框架中,先通过,然后。此外,Spring框架还提供了一些扩展,如、、,方便企业级应用开发中的等功能的实现。Spring框架的优势主要体现在以下几个方面:可插拔式的架构是指一个系

于枭森的博客 643

MEMS惯性传感器关键参数解析与误差优化策略

本文深入解析了MEMS惯性传感器的关键性能参数,如零偏稳定性、噪声与随机游走、振动整流误差等,并阐述了这些误差如何导致设备导航漂移、姿态不稳等问题。文章重点探讨了从硬件选型、系统设计到校准补偿、算法融合(如卡尔曼滤波)以及温度补偿等实战优化策略,旨在帮助工程师有效提升自动驾驶、无人机等设备的测量精度与稳定性。

weixin_28363123的博客 415

Java Spring 堆内存(heap)和栈内存(stack)

Spring 容器中的对象实例通常都是单例模式(Singleton)的,也就是说只会创建一个对象实例并共享,因此在多处引用该对象时都使用同一个对象实例,从而减少内存的使用。栈内存中的数据的生命周期与方法调用的生命周期是一致的,当一个方法被调用时,该方法中的所有局部变量和方法参数都会存储在栈内存中,当方法执行完毕后,内存将会自动释放这些栈内存中的数据。堆内存中的数据生命周期与对象的生命周期是一致的。当一个对象被创建时,它会存储在堆内存中,当它不再被引用时,它会被垃圾回收器回收,内存空间会被自动释放。

Hanhahahahah的博客 385

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

公司的历史项目在导出功能上引用的是poi-3.12版本,后续再做word模板导出功能时用到了poi-3.15版本,升级完后发现项目的很多导出功能都瘫痪了。用旧版本,新功能无法使用;用新版本,旧功能瘫痪,且整改的工作量比较大。使用maven-shade-plugin,将某个版本的依赖名称进行修改,重新引入即可。

S_White_Island的博客 1万+

ROS下UR+Realsense相机进行手眼标定

手眼标定主要是用来确定相机坐标系和机械臂坐标系之间的转换关系,从而实现后续的抓取等任务。

weixin_42157689的博客 7575

堆栈花园的框架学习备忘录——Spring

一、Spring的第一个核心功能ioc IoC (Inversion of Control):控制反转,是一个理论,概念,思想。 控制:创建对象,对象属性的赋值,对象之间的关系管理。 反转:把开发人员创建对象的权限转移给代码之外的容器,由容器代替开发人员管理对象,创建对象,给属性赋值。 为什么要用Ioc:目的是减少对代码的改动,实现不同的功能,解耦合。 二、 DI是ioc的技术实现 DI(Dependency Injection):依赖注入,只需要在程序中提供要使用的对象名就可以,至于对象是怎么创建的

堆栈花园的学习备忘录 311

EDA开源仿真工具verilator入门4:访问函数介绍

访问函数(Visitor Function)是verilator算法实现的主要工作方式之一,本节将介绍一下访问函数。

fangfanglovezhou的博客 1076

spring 框架

Spring 之IOC 容器和AOP 面向切面编程spring 是 Java EE 开发中的核心框架。spring 的核心分为两部分 IOC 和 AOP。spring 是Java EE 全栈级框架。通过spring 我们可以很好的实现程序的解耦和Java 类之间依赖关系的管理与维护,==声明式事务管理==。通过spring 框架可以很方便的整合其他的开源框架。IOC程序的耦...

qq_41578371的博客 255

DRAM刷新refresh相关知识归类-基础小知识(三)

RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。

Paul 安的博客 1万+

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法

DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection

qq_1532145264的博客 1478

spring框架(三)事务管理、PlatformTransactionManager、转账案例

AOP :切面编程 切面:切入点 和 通知 结合 spring aop 编程 <aop:config> 方法1: <aop:pointcut expression="切入点表达式" id=""> <aop:advisor advice-ref="通知引用" pointcut-ref="切入点的引用"> ...

ChihkAnchor的博客 1471

从编解码芯片看Tesla T4的隐藏实力:双NVDEC如何实现70路1080P解码?

本文深入剖析了英伟达Tesla T4显卡的隐藏实力,重点解读其独特的双NVDEC硬件解码器设计如何突破性能瓶颈。通过分析Turing架构、对比HEVC/H.264解码差异,并结合驱动与SDK优化,揭示了实现高达70路1080P视频流并发解码的原理与实战配置,为云游戏、直播转码等高并发场景提供高效解决方案。

weixin_29209801的博客 488

Spring框架分析(三) 事务管理和异步处理

        今天来说一说Spring中的事务管理机制把,在Spring中可以通过xml配置和注解配置的方式,实现对事务的管理和控制。xml配置,emmmmm,我已经忘得差不多了。主要是注解用的太爽了,哈哈哈哈。本篇文章就只说一下注解配置吧。之后待我复习一下xml配置,再整理一篇xml配置和注解配置的文章。 什么是事...

羽枫760的博客 7235

VB摄像头监控

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

(三)Spring框架之事务管理

一、编程式事务管理 Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,事务管理器接口PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务,这个方法里面的参数是Transactio...

weixin_34112208的博客 93

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

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

Spring框架学习笔记(三)(AOP,事务管理)

Spring框架学习笔记(三)九、AOP(1) 新建计算器核心功能(模拟:不能在改动核心代码)(2) 建立一个普通的Java类写增强代码(面向切面编程),使用Spring封装好的动态代理的工具(3)织入增强代码的位置,当执行哪个类中的哪个方法的时候,将增强的代码织入(4)启动AOP的代理(注解)(5)测试9.2 增强类型和连接信息 九、AOP Spring是IoC(DI)和AOP的容器框架,IoC是Spring的核心思想。 AOP(Aspect Oriented Programming):面向切面编程,

qq_47267252的博客 429

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring框架(三:AOP切面编程和Spring事务管理)

AOP和事务管理AOP 概述AOP 的基本概念springAOP 实现Spring 事物管理Spring 事务传播行为 AOP 概述 AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过 预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重 要内容。利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各 部分之间的耦合度降低,提高程序的可重用性,同时提

qq_53999369的博客 989

Spring5 框架 详解 ( 三 ) ---- 事务管理

@[TOC](Spring5 框架 详解 ( 四 ) ---- 事务管理) 一级目录 二级目录 三级目录

qq_39654399的博客 369

【JavaWeb】事务管理

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。在这两个方法上都添加了@Transactional注解,就代表这两个方法都具有事务,而在A方法当中又去调用了B方法。事务的传播行为:就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

小秀的博客 1401

SSM三大框架的整合(Spring+SpringMVC+MyBatis)

在Java后端开发领域,Spring+SpringMVC+MyBatis三大框架的使用尤为频繁,很多朋友学了这三个框架却不知道怎么整合起来,本文将带着大家一步步的实现三大框架的整合。

Robod的博客 770

spring+strtus2+hibernate三大框架整合

spring+strtus2+hibernate三大框架整合 一.整合原理 struts2与spring整合就是将struts2的Action对象由spring容器负责创建 hibernate与spring整合就是将SessionFactory对象交给spring容器来维护,spring负责Session创建以及aop事务 二.导包 1.hibernate包: hibernate本身必须包...

qq_42469834的博客 280

spring框架开发笔记 lesson5 三大框架整合

本文来自中软开创myc老师上课笔记

judy的博客 306

Spring的声明式事务管理(李刚 轻量级javaEE 企业应用实战-三大框架整合开发)...

最近在学习李刚著的《轻量级J2EE企业应用实战》,这本书写得条例清晰,通俗易懂,非常容易上手。在学习过程中,我自己参考该书做了些例子。下面是对Spring的声明式事务管理的总结和示例: 通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,不需要修改业务逻辑代码,在业务逻辑中可以专心业务逻辑代码的编写,无需编写大量的事务逻辑代码。让Spring声明式事务管理负责事...

weixin_33834137的博客 83

Spring-SpringMvc-Mybatis三大框架简单集成

SSM集成 框架集成核心 如果你的项目中,用到了Spring框架,那么其他框架主要就是和Spring集成!! 和Spring集成的核心思路 1、把当前框架的核心类,交给Spring管理 2、如果框架有事务,那么事务也要统一交给Spring管理 步骤: Spring Spring+SpringMVC Spring+Mybtis Spring+SpringMVC+Mybatis:管理事务 1.导jar...

baidu_39120378的博客 318

Spring事务管理学习笔记

事务管理 概念: 事务管理是对于一系列数据库操作进行管理,这一系列操作要么全部成功,要么全部失败。 特性: 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。 隔...

qq_44865654的博客 251
上一篇: 框架(二)Spring框架之使用JDBC模板实际案例
下一篇: Java基础案例
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值