模板方法在Spring事务中的应用
事务对于我们来讲不并陌生,也是在实际应用中一直都在使用。在JDBC中,事务大致的使用结构如下:
开启事务
业务逻辑处理
提交事务
Spring只是对事务进行了扩展和封装使用,现在看看在内部它是如何工作的。
1. PlatformTransactionManager
PlatformTransactionManager是一个接口,它定义的方法如下:
// 获取事务
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 提交事务
void commit(TransactionStatus status) throws TransactionException;
// 回滚事务
void rollback(TransactionStatus status) throws TransactionException;
看到这个类的定义,基本上对事务的功能有一个初步的掌握,完全就是平时写事务步骤的关键方法啊!
2. AbstractPlatformTransactionManager
AbstractPlatformTransactionManager它实现了PlatformTransactionManager接口。但是这个抽象类只是定义了一个骨架,抽象出
doBegin(),doCommit(),doRollback()这三个抽象方法让子类去实现。
3. DataSourceTransactionManager
DataSourceTransactionManager是JDBC事务的实现类,它继承了AbstractPlatformTransactionManager类,并实现了doBegin(),doCommit(),doRollback()这三个关键的方法。
DataSourceTransactionManager有一个成员是DataSource,在事务配置时,要传这个属性过去。
doBegin() 中有一个关键的代码:con.setAutoCommit(false);
doCommit() 中有一个关键的代码:con.commit();
doRollback() 中有一个关键的代码:con.rollback();
看到这里,有没有很熟悉的感觉呢?!
4. TransactionTemplate
TransactionTemplate是手动事务编程的模板类,它是如何来完成的呢?它有一个重要的方法:execute()方法,它里面定义了事务操作的基本骨架,剔除一些异常处理的代码,看看最关键的代码并作注释。
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
// 这里主要调用了doBegin()方法
TransactionStatus status = this.transactionManager.getTransaction(this);
T result;
try {
// 回调子类中的具体实现逻辑,处理业务逻辑
result = action.doInTransaction(status);
}catch(Exception e){
// 调用doRollback()方法
rollbackOnException(status, ex);
}
// 调用doCommit()方法
this.transactionManager.commit(status);
return result;
}
看完了应该明白了模板方法在它里面的应用了吧。
模板方法在Spring事务中的应用的更多相关文章
- Spring 事务中 readOnly 的解释
spring 中事务的PROPAGATION_REQUIRED,Readonly的解释 (2012-11-21 16:29:38) 转载▼ 标签: 杂谈 一. ...
- spring事务中隔离级别和spring的事务传播机制
Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要 么就不做.也就是说,事务必须是 ...
- spring事务中出现oracle游标溢出的解决方案
本例事务中大量查询SQL语句,会导致oracle游标溢出:对于数据库游标出现解决方案:1.大量查询SQL语句取消事务,只针对插入/更新 做事务处理2.用临时表代替大量查询SQL语句推荐使用第二种方案
- Spring事务中的readonly
来源:https://www.cnblogs.com/straybirds/p/9147892.html Spring的事务经常会有这样的配置: <tx:method name="se ...
- 【spring源码学习】spring事务中的嵌套事务中的保存点相关知识
JDBC事务保存点(setSavepoint, releaseSavepoint )实例 以下是使用事务教程中描述的setSavepoint和回滚的代码示例. 此示例代码是基于前面章节中完成的环境和数 ...
- Spring事务中的隔离级别
TransactionDefinition接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL ...
- Spring事务中的事务传播行为
1.支持当前事务: TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务:如果当前没有事务,则创建一个新的事务. Transaction ...
- spring事务传播机制实例讲解
http://kingj.iteye.com/blog/1680350 spring事务传播机制实例讲解 博客分类: spring java历险 天温习spring的事务处理机制,总结 ...
- 结合ThreadLocal来看spring事务源码,感受下清泉般的洗涤!
在我的博客spring事务源码解析中,提到了一个很关键的点:将connection绑定到当前线程来保证这个线程中的数据库操作用的是同一个connection.但是没有细致的讲到如何绑定,以及为什么这么 ...
随机推荐
- 增加Android模拟器空间(Internal Storage)
转载 http://vase.iteye.com/blog/2114664 初学Android,发现模拟器上有不少限制,譬如标题中的存储限制,无论用ADT Manager如何设置,内部存储空间不会 ...
- 升级vs17中的cordova-simulate
visual studio 17自带的cordova-simulate有一个bug,动态添加的html代码里面如果带有header,会出现js异常导致后面js程序终止执行,这个问题已经给他们提了iss ...
- webstrom 里面使用github
1.输入github的账号和密码,点击登录 2.复制github的项目地址,现在clone就行了
- Webcollector应用(二)
先吐槽一句哀家的人品,总在写好代码之后,网站默默的升级,没有一点点防备... 一.加代理 爬取一个网站的时候,爬了不到一半,IP被封了,整个内部局域网的所有电脑都不能访问网站了. public cla ...
- Linux环境Nginx安装、调试以及PHP安装
linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5 1.编译安装Nginx 官网:http://wiki.nginx.org/Install 下 ...
- Java的Stack类实现List接口真的是个笑话吗
今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”. 当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Ja ...
- 进程自我保护 适用于WIN7 X64
//进程自我保护,注意只有X64 WIN7可用 #include <ntddk.h> #define PROCESS_TERMINATE 1 typedef struct _LDR_DAT ...
- rest api load test
1. SoapUI + LoadUI 2. https://github.com/jeffbski/bench-rest 3. JMeter
- electron主进程引入自定义模块
对于electron以及nodejs开发,是一只小菜鸟,第一次想做个应用 只能边学边做,遇到各种各样的问题. 1.不想把所有的主进程函数放到一个文件中,这样文件比较乱,并且不好处理 想法:将另一个js ...
- HTK训练错误消息意义
在HTK训练线上数据的时候,遇到了ERROR [+6550] LoadHTKLabels: Junk at end of HTK transcription,这个问题,网上查阅是说有空行,结果根本没有 ...