spring(三) spring事务操作
前面一篇博文讲解了什么是AOP。学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理。
--wh
一、jdbcTemplate
什么是JdbcTemplate?
spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate。跟Dbutils一样,想要使用JdbcTemplate,就必须给他配置数据源。
第一步:导包
第二步:配置数据源,配置模版,给UserDao配置模版
使用dbcp充当数据源
使用c3p0充当数据源
第三步:UserDao中使用JdbcTemplate
但是spring为了让我们更方便,不用每次都写set方法和JdbcTemplate属性,给我们提供了一个类JdbcDaoSupport,我们只需要继承他,就可以直接获得jdbcTemplate了,因为JdbcDaoSupport中帮我们写了set方法
第四步:使用JdbcTemplate API操作数据库
update 进行 增删改操作
queryForObject 查询一个
query 查询所有
queryForInt 查询一个整形(分页)
第五步,测试 成功插入数据,其他的就不测了。
提升:使用properties
将连接数据的具体参数配合到properties文件,由spring加载properties,并在spring配置文件中使用
二、事务的回顾
如果一点都不清楚,看这篇博文,详细讲解了事务http://www.cnblogs.com/whgk/p/6182742.html
事务:一组业务操作,要么全部成功,要么全部失败
特性:ACID
A:原子性,是说事务是一个整体,要么全部成功,要么全部失败
C:一致性,数据完整,你转100给我,你减100,我要增加100
I:隔离性,并发(多个事务)
D:持久性,已经提交的事务,就已经保存到数据库中,不能在改变了
隔离问题:
脏读:读取到未提交的数据
不可重复读:读取到已经提交的数据(update)
虚度(幻读):读取到已经提交的数据(insert)
解决隔离问题
读未提交:存在三个问题。
读已提交:存在两个问题,解决脏读问题(Oracle默认级别)
可重复读:存在一个问题,解决脏读,不可重复读问题(Mysql默认级别)
串行化:解决所有问题。
而我们普通的程序要想使用事务的话,通过连接Connection来开启事务和关闭事务或者回滚,
三、spring如何进行事务的管理的理论分析
PlatformTransactionManager:事务平台管理器。
spring管理事务时,必须使用平台事务管理器,它是一个接口,相当于定义一个spring使用事务的规范,也就是如果你想用spring来帮你管理事务,那么就必须遵循这个规范,spring也帮我们实现了一些常用的技术所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他们都是实现spring中的PlatformTransactionManager接口的。
jdbc事务管理器:DataSourceTransactionManager
hibernate事务管理器:HibernateTransactionManager
PlatformTransactionManager是一个接口,那我们看它定义了哪些方法供我们使用的。
TransactionStatus getTransaction(TransactionDefinition);
获取事务,参数TransactionDefinition(事务详情),该参数是需要我们配置的,通过我们配置的内容才能知道事务如何去处理。这个下面会详解
commit(TransactionStatus);
根据状态来提交事务的操作
rollback(TransactionStatus);
根据状态来回滚事务的操作
TransactionStatus
spring使用管理器,通过状态对事务进行管理(操作),我们不必关心这个,因为这是spring内部操作的事情,但是我们可以了解一下有哪些方法
TransactionDefinition
spring管理器必须通过"事务详情"的设置,获取相应的事务,从而进行事务管理。这里这个很重要,我们需要配置这个
设置4个隔离级别就不用说了把,跟上面我们说的是一样的。解决隔离问题的四种级别。
传播行为:一个业务A,一个业务B,AB如何共享事务,不同传播行为共享方案不同。
什么意思呢?比如业务A为银行转账的业务。 业务B为转完账发短信的业务,平常我们是转完钱,那么我们就需要收到短信说我们的账户上被转走多少钱,而收钱的那一方则需要收到短信说账户被转进多少钱,那么这两个业务是使用同一个事务呢?还是分别使用不同的事务,也就是如果是使用同一个事务的话,我们转钱成功了代表业务A成功了,但是业务B发送短信时出现问题,则说明该事务失败,那么刚才转的钱就算不成功,需要回滚,但是实际生活中,是不能这样的,转钱成功了,短信没发送成功,那么短信在重新发送一次即可。不需要让业务A重新在操作一遍。这就是业务A和业务B共享事务的解决方法,让他们两个使用各自的事务。而传播行为就是提供这样的共享方案的属性。
传播行为方案
1.PROPAGATION_REQUIRED ,required ,必须使用事务 (默认值)
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B将创建一个新事务。
2.PROPAGATION_SUPPORTS,supports ,支持事务
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B 将以非事务执行。
3.PROPAGATION_MANDATORY,mandatory 强制
A 如果使用事务,B 使用同一个事务。(支持当前事务)
A 如果没有事务,B 抛异常
4.PROPAGATION_REQUIRES_NEW , requires_new ,必须是新事务
A 如果使用事务,B将A的事务挂起,再创建新的。
A 如果没有事务,B将创建一个新事务
5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支持事务
A 如果使用事务,B将A的事务挂起,以非事务执行
A 如果没有事务,B 以非事务执行
6.PROPAGATION_NEVER,never 从不使用
A 如果使用事务,B 抛异常
A 如果没有事务,B 以非事务执行
7.PROPAGATION_NESTED nested 嵌套
A 如果使用事务,B将采用嵌套事务。
嵌套事务底层使用Savepoint 设置保存点,将一个事务,相当于拆分多个。比如业务A为AB两个曹祖,业务B为CD两个操作,业务AB使用同一个事务,在AB (POINT) CD,当业务B失败时,回滚到POINT处,从而业务A还是成功的,就是保持点的操作。
底层使用嵌套try方式
掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED
总结:
spring事务编程的步骤
1、确定管理器
2、必须配置事务详情(是否只读,隔离级别,传播行为等)
配置好了事务详情,也确定了使用哪个管理器,那么spring就知道如何对事务进行怎样的处理了。
四、spring使用AOP技术来进行事务操作(基于xml)
上面我们知道了spring使用事务需要哪些东西,但是单纯的使用上面这些编写事务,那我们对每个需要使用事务的方法都需要写代码,岂不是累死,但是结合前面学习的AOP思想,就简单很多了。
重点看配置
重点看47到59行的代码,配置事务管理器和事务详情,然后通过aop将我们的事务应用到指定的切入点上去,使用的是表达式。指定一个范围。其中,事务详情和事务管理器的结合就相当于通知(加强的方法),所以菜在通知引用上可以写上exAdvice。这点必须想清楚。也就是我们都不需要自己手动写什么开启事务等代码,spring全帮我们写好了,我们只需要配置一下事务详情即可。
需要注意一点,因为使用的是spring内置的aop,没有使用AspectJ框架,所以如果没有使用接口,那么就需要写56行这行代码,如果使用了接口,那么就不需要写。需要通知spring使用cjlib代理
事务详情的配置
这样设置的话,就可以对不同的方法进行不同的事务处理了,很方便。比如add*,意思是add开头的方法,就使用传播行为为REQUIRED的事务进行处理,而find*,find开头的方法只能读,并且传播行为为REQUIRED。
五、spring使用AOP技术来进行事务操作(基于注解)
超级简单。三步
1、声明事务管理器
2、将事务管理器交予spring
前两步是在xml中写的
3、在目标类或方法上 使用注解即可 @Transactional
使用@Transactional(编写事务详情)
六、总结
上面所写的aop的是使用spring默认的aop,并没有使用AspectJ框架,要区分清楚。并且今天这篇讲的是使用aop对事务进行管理。其实也就是通过aop对指定的方法进行加强,而加强的内容就是事务的内容,而事务的内容也是由spring帮我们做的,也就是通知也是spring帮我们写的,我们只需要通过配置事务管理器和事务详情即可。而前面一篇,所有的通知都是我们自己手动编写的,为的是体验aop的那种思想,这是不一样的。所以不要把自己给搞混了。
第一篇博文:IOC(反转控制),在配置文件中配置bean,然后spring帮我们创建对象。默认就创建一个对象。singgton
第二篇博文:AOP(面向切面编程),理解了AOP思想,和spring如何使用AOP技术,底层使用jdk和cglib进行代理,有接口使用jdk,没有接口可以使用cglib。掌握了spring内置的aop技术,还有一个AspectJ框架。要知道这两个是如何配置的,会使用AspectJ的注解和xml方式
第三篇博文(本篇):AOP的应用(spring事务处理),spring帮我们将事务都已经写好了,我们只需要通过配置事务管理器,和事务详情(两者相当于通知了),然后使用spring内置的aop技术,将其在指定的方法上使用事务(相当于增强指定的方法),xml配置和注解两种方式。
第四篇博文:整合SSH框架
spring(三) spring事务操作的更多相关文章
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- (转)Spring中的事务操作
http://blog.csdn.net/yerenyuan_pku/article/details/70024364 事务的回顾 什么是事务 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么 ...
- Spring 中的事务操作、注解、以及 XML 配置
事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQ ...
- Spring(三) Spring IOC 初体验
Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...
- Spring(三) Spring IOC
Spring 核心之 IOC 容器 再谈 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器 ...
- spring 编程式事务管理和声明式事务管理
编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- Spring 声明式事务与编程式事务详解
本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...
随机推荐
- 【Linux】循环控制及状态返回值break、continue、exit、return
一.break.continue.exit.return的区别和对比 break n :如果省略n,则表示跳出整个循环,n表示跳出循环的层数 continue n:如果省略n,则表示跳过本次循 ...
- Inno Setup入门(二)——修改安装过程中的图片
修改安装过程中的图片 一般编译之后,安装过程中出现在左边图片是是下图这个样子的: 其实也可以修改它,只需要在setup段中作一点稍微的修改,加一行代码即可: [setup] AppName=Test ...
- Centos7新装配置, 并使用openvpn client长连接远程备份
1. 修改本机hostname // 查看本机hostname hostnamectl //永久性的修改主机名称, 修改完后新开的terminal中立刻生效. 也可以直接修改 /etc/hostnam ...
- 【LeetCode】199. Binary Tree Right Side View
Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...
- Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
一段PHP程序执行报错: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261181 ...
- Linux 源代码在线(http://lxr.linux.no/linux/)。
LXR 是一个通用的源代码索引器和交叉引用器 它提供了一个基于 web 的可浏览任意定义以及任意标识的用法. 它支持很多种语言. LXR 曾经被作为 “Linux 交叉引用器” 但是已经被证明它可以用 ...
- Linux运维工程师面试-部分题库
一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? 2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解? ...
- git学习笔记(三)—— 远程仓库
一.gitHub&&SSH Key 为git仓库提供托管服务的,所以注册一个github账号,就可以免费获得git远程仓库. 本地Git仓库和GitHub仓库之间的传输是通过SSH加密 ...
- 记录EntityValidationErrors的详细信息
0.一个问题 使用过EF的人相信都会遇到Validation failed for one or more entities. See ‘EntityValidationErrors’这种异常,这是由 ...
- hibernate 注解 boolean问题解决方案
1.JPA本身是不支持boolean.可以用Hibernater自带的标签.修改如下. @Column(name = "manager_log") @org.hibernate.a ...