• Spring可以支持编程式事务和声明式事务。
  • Spring提供的最原始的事务管理方式是基于TransactionDefinitionPlatformTransactionManagerTransactionStatus 编程式事务。
  • TransactionTemplate的编程式事务管理是使用模板方法设计模式对原始事务管理方式的封装。

源码探索

查看 TransactionTemplate.java 源码

public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean {protected final Log logger = LogFactory.getLog(this.getClass());private PlatformTransactionManager transactionManager;public TransactionTemplate() {}public TransactionTemplate(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) {super(transactionDefinition);this.transactionManager = transactionManager;}public void setTransactionManager(PlatformTransactionManager transactionManager) {this.transactionManager = transactionManager;}public PlatformTransactionManager getTransactionManager() {return this.transactionManager;}public void afterPropertiesSet() {if (this.transactionManager == null) {throw new IllegalArgumentException("Property 'transactionManager' is required");}}/**  控制事务管理主要依赖于这个方法*/public <T> T execute(TransactionCallback<T> action) throws TransactionException {if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {return ((CallbackPreferringPlatformTransactionManager)this.transactionManager).execute(this, action);} else {TransactionStatus status = this.transactionManager.getTransaction(this);Object result;try {result = action.doInTransaction(status);} catch (RuntimeException var5) {this.rollbackOnException(status, var5);throw var5;} catch (Error var6) {this.rollbackOnException(status, var6);throw var6;} catch (Exception var7) {this.rollbackOnException(status, var7);throw new UndeclaredThrowableException(var7, "TransactionCallback threw undeclared checked exception");}this.transactionManager.commit(status);return (T) result;}}private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException {this.logger.debug("Initiating transaction rollback on application exception", ex);try {this.transactionManager.rollback(status);} catch (TransactionSystemException var4) {this.logger.error("Application exception overridden by rollback exception", ex);var4.initApplicationException(ex);throw var4;} catch (RuntimeException var5) {this.logger.error("Application exception overridden by rollback exception", ex);throw var5;} catch (Error var6) {this.logger.error("Application exception overridden by rollback error", ex);throw var6;}}}

从源码可以看出TransactionTemplate主要依赖于execute(TransactionCallback<T> action)方法执行事务管理。


再来分析分析execute方法的参数 TransactionCallback

查看接口TransactionCallback.java 发现其仅有一个方法:

public interface TransactionCallback<T> {T doInTransaction(TransactionStatus var1);
}

并且有一个抽象类TransactionCallbackWithoutResult实现了接口TransactionCallback

public abstract class TransactionCallbackWithoutResult implements TransactionCallback<Object> {public TransactionCallbackWithoutResult() {}public final Object doInTransaction(TransactionStatus status) {this.doInTransactionWithoutResult(status);return null;}protected abstract void doInTransactionWithoutResult(TransactionStatus var1);
}

所以当我们借助TransactionTemplate.execute( ... )执行事务管理的时候,传入的参数有两种选择:
1、TransactionCallback
2、TransactionCallbackWithoutResult
两种区别从命名看就相当明显了,一个是有返回值,一个是无返回值。这个的选择就取决于你是读还是写了。


实现案例

1、在spring配置文件中配置相关TransactionTemplate示例:

    <!-- 事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置 transactionTemplate --><bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager"><ref bean="transactionManager"/></property></bean>

2、对TransactionCallback进行属性设置(该设置也可以在Spring的配置文件中指定,看个人需求)

         //设置事务传播属性transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);// 设置事务的隔离级别,设置为读已提交(默认是ISOLATION_DEFAULT:使用的是底层数据库的默认的隔离级别)transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);// 设置是否只读,默认是falsetransactionTemplate.setReadOnly(true);// 默认使用的是数据库底层的默认的事务的超时时间transactionTemplate.setTimeout(30000);

3、业务代码引用:
(1)借助(TransactionCallback)执行事务管理,既带有返回值:

public Object getObject(String str) {/**  执行带有返回值<Object>的事务管理*/transactionTemplate.execute(new TransactionCallback<Object>() {@Overridepublic Object doInTransaction(TransactionStatus transactionStatus) {try {...//.......   业务代码return new Object();} catch (Exception e) {//回滚transactionStatus.setRollbackOnly();return null;}}});
}

(2)借助(TransactionCallbackWithoutResult)执行事务管理,既无返回值:

public void update(String str) {/**  执行无返回值的事务管理*/transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {try {// ....  业务代码} catch (Exception e){//回滚transactionStatus.setRollbackOnly();}}});
}

深入理解TransactionTemplate编程式事务相关推荐

  1. TransactionTemplate编程式事务

    目录 一.TransactionTemplate相关源码 Spring支持编程式事务和声明式事务: 因为业务1.需要细粒度更高的事务控制:2.需要频繁与其他系统交互 举例:需要从A系统获取数据,根据获 ...

  2. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

  3. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  4. Spring事务处理之 编程式事务 和 声明式事务

    对事务概念还不了解的可以先看一下 MySQL事务管理(初步了解) 这篇文章 !!! Spring事务管理学习步骤: 1.掌握Spring事务属性 2.掌握Spring事务核心API 3.掌握Sprin ...

  5. java编程式事务_Spring编程式和声明式事务实例讲解

    Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理: 通过Transaction Template手动管理事务,实际应用中很少使用, 使用XML配置声明式事务: 推荐使用(代码 ...

  6. Spring笔记(4) - Spring的编程式事务和声明式事务详解

    一.背景 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作 ...

  7. 全面分析 Spring 的编程式事务管理及声明式事务管理

    转自:http://www.open-open.com/lib/view/open1414310646012.html 关于本教程 本教程将深切讲授 Spring 庞杂而丁壮夜的事务治理功用,包括编程 ...

  8. Spring中的编程式事务与声明式事务

    目录 编程式事务 使用TransactionTamplate 使用TransactionManager 声明式事务 XML文件配置 java代码配置---@transactional 编程式事务 通过 ...

  9. [事务] 编程式事务和声明式事务的优缺点

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID.隔离级别. ...

最新文章

  1. 如何在服务器中找到数据库文件夹,如何在服务器中找到数据库文件
  2. java remote desktop_Remote Desktop
  3. JAVA——DES/ECB/PKCS7Padding加密算法[Cannot find any provider supporting DESEDE/CBC/PKCS7Padding]解决方案
  4. 【NetApp】NetBoot的使用方法
  5. PowerPC VxWorks BSP分析(1)--PowerPC体系结构
  6. Protobuf使用规范分享
  7. 疑问:当流量被封禁之后(论资本之力):防流量被恶意盗挖(抛砖篇)
  8. java 蓝桥杯 数字游戏
  9. Google docs支持上传任何文档包括pdf...Cool!
  10. 可变车道怎么走不违章_可变车道怕走错扣分罚款,学学老司机的办法,新手司机学会不吃亏...
  11. LinkCode 第k个排列
  12. Java solrj client 添加JavaEntity Bean
  13. 广和通LTE Cat4模组L716焕新升级,为IoT行业提供经济普适无线应用
  14. 浅谈域名抢注和域名投资
  15. JavaScript 代码的执行流程
  16. Win10卸载KB5014699补丁教程
  17. 【钉钉】通过钉钉机器人抓取群消息
  18. onedrive免费扩容10G
  19. BZOJ1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机
  20. EF An error occurred while updating the entries. See the inner exception for details.

热门文章

  1. 一图读懂:咖啡店的各种咖啡
  2. 黑帽SEO都有哪些作弊手法?
  3. Facebook扎克伯格成功六大要素:执行力在列
  4. Dockerfile 之 ENTRYPOINT
  5. PID学习笔记-3-正反作用的调节
  6. linux 内存虚拟盘,Linux_内存虚拟盘软件XMSDSK的使用教程,随着时代的发展,电脑的内存 - phpStudy...
  7. linux安装软件输入密码后取消安装,Ubuntu16.04系统安装后的10件真正必做之事
  8. 移动平台 iPhone开发基础视频教程-第1季_千锋学院出品
  9. spark读Hbase数据集成Hbase Filter(过滤器)
  10. iOS 字符串截取、iOS 字符串替换、iOS 字符串分隔、iOS 字符串匹配、截取字符串、匹配字符串、分隔字符串