模板方法在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.但是没有细致的讲到如何绑定,以及为什么这么 ...
随机推荐
- CSS3 object-fit 图像裁剪
MDN定义 https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit 该 object-fit CSS 属性指定替换元素的内容应该如何适应 ...
- charles抓包误点deny处理办法及日常抓包
误点deny方法在最底下~~ (博文为转载) 我们在开发网站项目的时候,我们可以通过浏览器的debug模式来看request以及response的数据,那么如果我们开发移动端项目没有网页呢?如何抓取数 ...
- chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- 远程连接 mysql 数据库连接不上的解决方案
今天用Navicat访问虚拟机上的mysql,无法访问报cannot connect(10038). 首先看是否可以telnet,本机cmd,telnet 10.10.10.10 3306,结果是连接 ...
- for循环练习题(共六道题)
第一题: 假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额 ...
- 【转载】OpenMAXIL介绍与其体系
1 OpenMAX IL介绍与其体系 这一部分的文档描述 OpenMAX IL的特性与体系. 1.1 OpenMAX IL 简述 OpenMAX IL 软件接口层定义了一套API,用于访问系统中的组件 ...
- css 画的动画表情
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 计算机网络应用层之cookie
一.生活中的cookie 无论你知不知道Cookie是什么,在你的生活中,肯定有使用过它.还记得你使用浏览器浏览网页时,当你要登陆时,网页上有一个记住密码或自动登陆的选项,当你选择时,你就使用了Coo ...
- 【WPF】淡入淡出切换页面
<NavigationWindow x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsof ...
- JDOM读取xml
[摘 要]JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作. 一.JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术 ...