TransactionTemplate编程式事务管理方式的进阶使用---自定义拓展模板类
1, 前面一篇的文章介绍了TransactionTemplate的基本使用方法.
同事在其基础上又做了一层封装,这样更贴合本公司的业务与规范.
2, 首先定义了两个接口:
ServiceTemplate ----> 对TransactionTemplate进行了封装
public interface ServiceTemplate {
/**
* <pre> 无事务模板执行业务处理
* 1. 异常捕获,及分类处理
* 2. 业务日志记录
* </pre>
*
* @param <T>
* @param clazz 返回对象
* @param action 业务操作回调的接口
* @return 服务返回对象
*/
<T> T executeWithoutTransaction(Class<? extends Result> clazz, ServiceCallback action);
/**
* <pre> 支持本地事务模板执行业务处理
* 1. 本地事务封装
* 2. 异常捕获,及分类处理
* 3. 业务日志记录
* </pre>
*
* @param <T>
* @param clazz 返回对象
* @param action 业务操作回调的接口
* @return 服务返回对象
*/
<T> T execute(Class<? extends Result> clazz, ServiceCallback action);
}
ServiceCallback ----> 对TransactionCallBack进行了封装
public interface ServiceCallback {
/**
* <pre> 校验
* 对于校验不通过,异常驱动返回
* </pre>
*/
void doLock();
/**
* <pre> 校验
* 对于校验不通过,异常驱动返回
* </pre>
*/
void check();
/**
* <pre> 执行业务逻辑
* </pre>
* @return
*/
Result executeService();
}
ServiceTemplate的具体实现如下:
public class ServiceTemplateImpl implements ServiceTemplate {
/** 事务模板 */
@Autowired
private TransactionTemplate transactionTemplate;
@Override
public <T> T executeWithoutTransaction(Class<? extends Result> clazz,
ServiceCallback action) {
Result result = null;
try {
// 执行校验
action.check();
//锁操作
action.doLock();
// 执行处理逻辑
result = action.executeService();
//可以对结果进行初步校验TODO
} catch (自定义异常 e) {
//打日志TODO
return (T) result;
} catch (Throwable e2) {
//打日志TODO
return (T) result;
}
return (T) result;
}
@Override
@SuppressWarnings("unchecked")
public <T> T execute(final Class<? extends Result> clazz, final ServiceCallback action) {
T acResult = (T) transactionTemplate.execute(new TransactionCallback() {
/**
* @see org.springframework.transaction.support.TransactionCallback#doInTransaction(org.springframework.transaction.TransactionStatus)
*/
public Object doInTransaction(TransactionStatus status) {
Result result = null;
try {
result = clazz.newInstance();
// 执行校验逻辑
action.check();
//锁操作
action.doLock();
// 执行处理逻辑
result = action.executeService();
// 返回值异常处理
if (result == null || !(result instanceof BaseResult)) {
throw new 自定义异常;
}
} catch (自定义异常 e) {
// 业务异常捕获, 回滚, 打日志TODO
status.setRollbackOnly();
return result;
} catch (Throwable e2) {
// 系统异常捕获, 回滚, 打日志TODO
status.setRollbackOnly();
return result;
}
return result;
}
});
return acResult;
}
}
3, 在业务方法中使用ServiceTemplate, 通过构建ServiceCallBack匿名内部类的方式, 传递具体的业务代码:
public Result update(final BaseOrder baseOrder) {
return serviceTemplate.execute(BooleanResult.class, new ServiceCallback() {
@Override
public void doLock() {
//进行锁操作
}
@Override
public void check() {
//进行校验
}
@Override
public Result executeService() {
Result result = new Result();
//具体的业务代码
return result;
}
});
}
注意: 如果是不需要加事务的方法, 如查询 ,那么调用serviceTemplate的executeWithoutTransaction即可
TransactionTemplate编程式事务管理方式的进阶使用---自定义拓展模板类的更多相关文章
- Spring事务管理的另一种方式--TransactionTemplate编程式事务管理简单入门
1, 一直以来, 在用Spring进行事物管理时, 只知道用声明式的策略, 即根据不同的数据源, 配置一个事物管理器(TransactionManager), 通过配置切面(PointCut)应用到相 ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- Spring学习8-Spring事务管理(编程式事务管理)
一.Spring事务的相关知识 1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...
- spring 编程式事务管理和声明式事务管理
编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...
- 全面分析 Spring 的编程式事务管理及声明式事务管理--转
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
- 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理
Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...
- Spring编程式事务管理及声明式事务管理
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
- 深入理解TransactionTemplate编程式事务
Spring可以支持编程式事务和声明式事务. Spring提供的最原始的事务管理方式是基于TransactionDefinition.PlatformTransactionManager.Transa ...
- Spring编程式事务管理和声明式事务管理
本来想写一篇随笔记一下呢,结果发现一篇文章写的很好了,已经没有再重复写的必要了. https://www.ibm.com/developerworks/cn/education/opensource/ ...
随机推荐
- IBM新合作伙伴计划助力企业转型升级
IBM作为老牌企业,一直在引领者技术方面的变革.当IBM再一次从自我革新开始,期望能够更快的将认知计算和云推广给自己的合作伙伴和用户们,以帮助他们在新的转型期内,能够快人一步. ...
- PHP提取字符串中的所有汉字
<?php $str = 'aiezu.com 爱E族, baidu.com 百度'; preg_match_all("#[\x{4e00}-\x{9fa5}]#u", $s ...
- 百度统计API的使用
百度统计API的使用 在搭建自己博客的时候,希望自己能有个日志系统,能够看到PV.UV等信息,同时自己也搭建了个ELK系统,可惜服务器配置太低(1GHZ+1G内存),根本运行不起来.只能使用第三方的日 ...
- Chapter 2. Video Formats and Quality
本章节主要介绍一些视频格式相关的基础知识. 交织(Interlace) 即每一个采样帧采样时隔行采样,奇数行和偶数行交替. YCbCr 人眼视觉系统(Human Visual System, HVS) ...
- windows上将代码上传到Github
Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public, Private : 仓库权限(公开共享,私有或指定合作者) Initialize this ...
- HTML5 LocalStorage 本地存储总结
存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者 window.localStorage["a"] ...
- 把本地git仓库中的项目引入到码云上
一.安装git软件和TortoiseGit客户端(git需配置环境变量,但安装时已经配置好,无需考虑) 二.生成公钥和私钥(建立与码云的连接) 三.在码云上新建项目(建议在组织的基础上) 四.在码 ...
- js-txt文本处理
js-txt文本处理 写自己主页项目时所产生的小问题拿出来给大家分享分享,以此共勉. ---DanlV TextArea的换行符处理 TextArea文本转换为Html:写入数据库时使用 js获取了t ...
- windows 10 下使用 binwalk
刚接触CTF没什么经验,菜鸟一只很多题不会做,就在网上看大佬写的Write up.发现经常会用到一个小工具--binwalk.binwalk在kali系统里是一个自带的工具,但windows可没有.之 ...
- 上传图片并生成相关缩略图-PHP
if(!empty($_FILES["fileField"]["name"])){//检测表单传递文件数据 $fileinfo = $_FILES[" ...