模板方法在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.但是没有细致的讲到如何绑定,以及为什么这么 ...
随机推荐
- django 项目中的 favicon.ico 处理
django 项目中的 favicon.ico 处理 (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...
- GitHub vs GitLab:它们有什么区别?
查看原文GitLab vs. GitHub: How Are They Different? 两者都是基于web的Git repositories(仓库),拥有流水线型的web开发流程,它们为开发团队 ...
- nginx 查看当前的连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' https://www.cnblogs.com/lianzhil ...
- PDO和mysqli对比
PHP中,如何选择PDO和mysqli呢?本文做个简单的比较 1)总的比较 PDO MYSQLI 数据库支持 12种不同的数据库支持 支持MYSQL API OOP OOP和过程 命名参数 支持 ...
- web项目更改文件后缀,隐藏编程语言
从Java EE5.0开始,<servlet-mapping>标签就可以配置多个<url-pattern>.例如可以同时将urlServlet配置一下多个映射方式: <s ...
- oracle相关命令收集-张
orcle相关命令收集 1,用管理员登陆 /as sysdba:2, 更改用户密码 alter user name identified by password: alter user exptest ...
- hdu 5001(概率DP)
Walk Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Median of Two Sorted Arrays——算法课上经典的二分和分治算法
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- 安卓使用WebView清除缓存
原文:https://blog.csdn.net/liwei123liwei123/article/details/52624826 Android 清除WebView缓存 最近项目中需要用WebVi ...
- 全连通图求最小生成树边权之积(邻接矩阵/prim/kruskal)
Description 大家都知道最小生成树一般求的是构成最小生成树的边的权值之和. 现在请求构成最小生成树的边的权值之积 S,最终结果请输出 (S % 100003). P.S. 点之间的边为无向边 ...