文档章节

Spring编程式和声明式事务

梨加橙
 梨加橙
发布于 2018/06/19 16:31
字数 605
阅读 81
收藏 4

1.编程式事务

1.1 编程式和声明式事务的区别

Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。 
简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。

1.2 如何实现编程式事务?

Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。

1.2.1 使用TransactionTemplate

采用TransactionTemplate和采用其他Spring模板,如JdbcTempalte和HibernateTemplate是一样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线程安全的。代码片段:

    TransactionTemplate tt = new TransactionTemplate(); // 新建一个TransactionTemplate
    Object result = tt.execute(
        new TransactionCallback(){  
            public Object doTransaction(TransactionStatus status){  
                updateOperation();  
                return resultOfUpdateOperation();  
            }  
    }); // 执行execute方法进行事务管理

使用TransactionCallback()可以返回一个值。如果使用TransactionCallbackWithoutResult则没有返回值。

1.2.2 使用PlatformTransactionManager

示例代码如下:

    //定义一个某个框架平台的TransactionManager,如JDBC、Hibernate
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); 
    // 设置数据源
    dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource());
    // 定义事务属性 
    DefaultTransactionDefinition transDef = new DefaultTransactionDefinition();
    // 设置传播行为属性 
    transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
    // 获得事务状态 
    TransactionStatus status = dataSourceTransactionManager.getTransaction(transDef); 
    try {
        // 数据库操作
        dataSourceTransactionManager.commit(status);// 提交
    } catch (Exception e) {
        dataSourceTransactionManager.rollback(status);// 回滚
    }

2.声明式事务

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

2.1 配置方式

根据代理机制的不同,总结了五种Spring事务的配置方式:

(1)每个Bean都有一个代理

(2)所有Bean共享一个代理基类

(3)使用拦截器

(4)使用tx标签配置的拦截器

(5)全注解

<!-- 定义事务 -->
	<bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

 

本文转载自:https://blog.csdn.net/trigl/article/details/50968079#t14

梨加橙
粉丝 35
博文 56
码字总数 43402
作品 0
南昌
后端工程师
私信 提问
Spring的四大优势,你是如何理解的?

1、方便解耦,简化开发 Spring是分层的 Java SE/EE 应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提...

骚年锦时
05/15
21
0
Spring编程式和声明式事务实例讲解

Java面试通关手册(Java学习指南):https://github.com/Snailclimb/JavaGuide 历史回顾: 可能是最漂亮的Spring事务管理详解 Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理...

snailclimb
2018/05/23
0
0
Spring事务--声明式事务和编程式事务

声明式事务和编程式事务 声明式事务是基于代理实现的。最小的力度是方法级。编程式事务是基于事务模版来做的,具有较高的侵略性,不建议使用。 编程式事务管理 基于底层 API 的编程式事务管理...

细节探索者
09/10
38
0
Spring基于@Transactional的声明式事务

采用编程式事务,手动控制commit还是rollback是正常的。但是采用基于注解的声明式事务,就一直不生效。大神帮忙看看是什么问题 spring配置文件及业务代码如下: spring配置文件: 业务代码-...

清风-蓝魔泪
2018/04/16
416
3
怎么使用Spring配置事务 ?

Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。 声明式事务管理的配置方式,通常有以下4种: (1) 使用TransactionProxyFactoryBean为目标Bean生成事务代理...

a'ゞ浪人گق
2018/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https://blog.51cto.com/kaliarch/2044618 一、概述 1.1 背景 ......

linjin200
6分钟前
1
0
CDH6.0.1集成tez-0.9.1计算引擎

参考文章: https://www.jianshu.com/p/9fb9f32e1f0f https://www.baidu.com/link?url=OgpwasnZi7H1dySN2T111sseEWDBaCCTC3DFV61G7756YbrkJCA8Y3UFaueyqnfN&wd=&eqid=daeb8b3500049cf3000000......

Sheav
8分钟前
1
0
Vue内置指令的使用

v-model(数据绑定) v-model常用于表单数据的双向绑定,它本质上是一个语法糖。它主要的有两种应用: 在文本框、多行文本、input的下拉框、单选按钮、复选框中的应用 <div id="app"> ...

凌兮洛
9分钟前
1
0
外部来源应用检查-烦死了,终于找到解决设置了

Android 连接usb调试应用的时候: 华为关闭方法:1、设置-安全-更多安全设置,关掉外部来源应用检查。2、设置-系统-开发人员选项-关闭“监控ADB安装应用” 不知道OPPO 怎么关闭的?...

QGlaunch
10分钟前
2
0
6个K8s日志系统建设中的典型问题,你遇到过几个?

作者 | 元乙 阿里云日志服务数据采集客户端负责人,目前采集客户端 logtail 在集团百万规模部署,每天采集上万应用数 PB 数据,经历多次双 11、双 12 考验。 导读:随着 K8s 不断更新迭代,使...

阿里云官方博客
12分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部