1Spring事务传播行为

所谓事务传播行为就是多个事务方法相互调用时,事务怎样在这些方法间传播。Spring支持7种事务传播行为

PROPAGATION_REQUIRED(增加已有事务)

假设当前没有事务。就新建一个事务。假设已经存在一个事务中,增加到这个事务中。这是最常见也是默认的方式。

PROPAGATION_SUPPORTS(尾随环境)

支持当前事务,假设当前没有事务,就以非事务方式运行。

PROPAGATION_MANDATORY(须要事务)

使用当前的事务,假设当前没有事务。就抛出异常。

PROPAGATION_REQUIRES_NEW(独立事务)

新建事务,假设当前存在事务。把当前事务挂起。

PROPAGATION_NOT_SUPPORTED(非事务方式)

以非事务方式运行操作,假设当前存在事务。就把当前事务挂起。

PROPAGATION_NEVER(排除事务)

以非事务方式运行,假设当前存在事务,则抛出异常。

PROPAGATION_NESTED(嵌套事务)

假设当前存在事务,则在嵌套事务内运行。假设当前没有事务,则运行与PROPAGATION_REQUIRED类似的操作。

Spring默认的事务传播行为是PROPAGATION_REQUIRED。它适合于绝大多数的情况。

如果ServiveX#methodX()都工作在事务环境下(即都被Spring事务增强了),如果程序中存在例如以下的调用链:Service1#method1()->Service2#method2()->Service3#method3(),那么这3个服务类的3个方法通过Spring的事务传播机制都工作在同一个事务中。

假设在一个ServiceA和a()方法中启动一个线程,在这个新创建的线程中运行ServiceB的事务方法b()。

在同样线程中进行相互嵌套调用的事务方法工作于同样的事务中。假设这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。

2多种数据持久方法事务管理

假设你採用了一个高端ORM技术(Hibernate。JPA,JDO),同一时候採用一个JDBC技术(Spring JDBC。iBatis),因为前者的会话(Session)是对后者连接(Connection)的封装。Spring会“足够智能地”在同一个事务线程让前者的会话封装后者的连接。所以。我们仅仅要直接採用前者的事务管理器就能够了。下表给出了混合数据訪问技术所相应的事务管理器:

1不同持久方式的事务统一

Spring提供了一个能从当前事务上下文中获取绑定的数据连接的工具类,那就是DataSourceUtils。Spring强调必须使用DataSourceUtils工具类获取数据连接。

static Connection doGetConnection(DataSource dataSource)

首先尝试从事务上下文中获取连接。失败后再从数据源获取连接;

static Connection getConnection(DataSource dataSource)

doGetConnection方法的功能一样,实际上,它内部就是调用doGetConnection方法获取连接的。

static void
 doReleaseConnection(Connection con, DataSource dataSource)

释放连接,放回到连接池中;

static void
release Connection(Connection con, DataSource dataSource)

和doReleaseConnection方法的功能一样。实际上,它内部就是调用doReleaseConnection方法获取连接的。

測试demo:

@Service
public class TestTranscationServiceImpl implements TestTranscationService {     @Autowired
    private TestTranscationDao testTranscationDao;     @Override
    @Transactional
    public int test(){
        testTranscationDao.update1();
        testTranscationDao.update2();       
        return 0;
    }
}
@Autowired
    private JdbcTemplate jdbcTemplate;     @Override
    public int update1() {
        //1.获得数据库连接
        Connection con = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
        try {
            con.prepareStatement("update grade_info set grade_name='11' where grade_id=1").executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            //2假设当前方法没有上下文事务管理,不释放数据库连接会造成数据库连接泄露
            //假设存在上下文事务,调用或者不调用数据库连接释放都没有问题
            DataSourceUtils.releaseConnection(con, jdbcTemplate.getDataSource());
        }
        return 0;     }     @Override
    public int update2(){
        //3.获得数据库连接   和1的数据库连接是同一个连接
        Connection con = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
        try {
            //4.这样的方法取到的数据库连接和 1,3取到的数据库连接不同
            Connection conn = jdbcTemplate.getDataSource().getConnection();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return jdbcTemplate.update("update grade_info set grade_name='高中三年级' where grade_id=1");
    }

Spring为每一个数据訪问技术框架都提供了一个获取事务上下文绑定的数据连接(或其衍生品)的工具类和数据源(或其衍生品)的代理类。

2Hibernate和JDBC混合使用注意事项

因为Hibernate一级缓存的原因,在通过save,update,delete等方法操作数据时,并没有真正向数据库发送SQL。仅仅有调用flush()时,Hibernate才会将一级缓存中的状态变化同步到数据库中。

Hibernate的事务管理在提交事务时。会自己主动调用flush()操作,将一级缓存同步到数据库中,此时才会将产生并向数据库发送SQL语句。

正是由于以上原因的存在,全部在混合使用JDBC和Hibernate时。可能存在丢失更新的问题。

在混合使用Hibernate和JDBC时,JDBC的操作不会同步到Hibernate的缓存中(一级缓存及二级缓存)。Hibernate缓存中的状态变更也不被JDBC感知。因此混合使用时必须特别关注这一点。

因为混合数据訪问技术的方案的事务同步而缓存不同步的情况。所以最好用Hibernate完毕读写操作,而用Spring JDBC完毕读的操作。如用Spring JDBC进行简要列表的查询,而用Hibernate对查询出的数据进行维护。假设确实要同一时候使用Hibernate和Spring JDBC读写数据。则必须充分考虑到Hibernate缓存机制引发的问题:必须充分分析数据维护逻辑,依据须要。及时调用Hibernate的flush()方法,以免覆盖Spring
JDBC的更改,在Spring JDBC更改数据库时。维护Hibernate的缓存。

3Spring的事务增强限制条件

因为Spring事务管理是基于接口代理或动态字节码技术,通过AOP实施事务增强的。

对于基于接口动态代理的AOP事务增强来说,因为接口的方法是public的,这就要求实现类的实现方法必须是public的(不能是protected。private等)。同一时候不能使用static的修饰符。所以,能够实施接口动态代理的方法仅仅能是使用“public”或“public final”修饰符的方法,其他方法不可能被动态代理,对应的也就不能实施AOP增强,也即不能进行Spring事务增强了。

基于CGLib字节码动态代理的方案是通过扩展被增强类,动态创建子类的方式进行AOP增强植入的。

因为使用final,static,private修饰符的方法都不能被子类覆盖,对应的,这些方法将不能被实施的AOP增强。所以,必须特别注意这些修饰符的使用。以免不小心成为事务管理的漏网之鱼。

4Spring事务管理的异常捕捉,事务回滚

spring的事务管理器仅仅对 unchecked exception进行异常回滚,Error和RuntimeException及其子类是unchecked exception.其它exception是checked exception.

假设在service层中,使用了try ,catch来捕捉异常,导致sevice层出现的异常被 “截留”,无法抛出给事务管理器,这就给事务管理器造成一种假象,就像程序在执行中,没有产生不论什么问题,因此也就不会对出现 runtimeException进行回滚操作。

文章来自于网上资源整理,自己经过demo測试

友情链接:

《Spring 3.x企业有用开发实战》作者博客http://stamen.iteye.com/category/209694有相关系列博文

百度文库PPT: 

url=kyFTy_589oFoWW6S5lqLYMpE-RcGbNKM4DOt2dXRvfo0Ge6qAZ-GTHs6JM-FrdfHMPvkDTXRkPY88GYDqucJpGq4fZEWPQof_W3xA9PcXBy###" target="_blank" rel="nofollow">Spring先进的交易管理问题问题分析


版权声明:本文博客原创文章,博客,未经同意,不得转载。

Spring先进的交易管理困难剖析的更多相关文章

  1. spring 声明式事务管理详解

    前言:spring框架对于事务管理提供了两种方案.一,编程式事务.二,声明式事务.本例主要剖析 声明式事务. 何为声明式事务: 通过spring的配置文件配置事务规则,或使用spring @Trans ...

  2. Spring Cloud 分布式事务管理

    Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Clo ...

  3. Spring详解------事务管理

    目录 1.事务介绍 2.事务的四个特性(ACID) 3.Spring 事务管理的核心接口 4. PlatformTransactionManager  事务管理器 5.TransactionStatu ...

  4. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

  5. 自定义Spring Security权限控制管理(实战篇)

    上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...

  6. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  7. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  8. 完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群

    完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群 maven依赖 <dependency> <groupId>org.quartz-scheduler ...

  9. Spring对Hibernate事务管理

    谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...

随机推荐

  1. 面试题 收集请求k千里马

    收集请求k最大值 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将来从事算法 ...

  2. 对于Hadoop的MapReduce编程makefile

    根据近期需要hadoop的MapReduce程序集成到一个大的应用C/C++书面框架.在需求make当自己主动MapReduce编译和打包的应用. 在这里,一个简单的WordCount1一个例子详细的 ...

  3. Win 10开门人类智慧的世界领先

    3月18日,从微软硬件project大会(WinHEC 2015)上传来好消息:今年夏天,Win 10将要正式公布.Win 10公布,有何新意? 微软新领导人纳德拉(Nadella)主张:运计算,大数 ...

  4. ROW_NUMBER() OVER 排序函数的基本用法

    ROW_NUMBER() OVER 排序函数 select ROW_NUMBER() OVER (PARTITION BY guide_id ORDER BY pic_sort) as rowid,p ...

  5. 集群部署及测试SolrCloud-5

    SolrCloud-5.2.1 集群部署及测试   一. 说明 Solr5内置了Jetty服务,所以不用安装部署到Tomcat了,网上部署Tomcat的资料太泛滥了. 部署前的准备工作: 1. 将各主 ...

  6. AIX 7.1 install python

    周围环境AIX7.1   设备python-2.6.2  因为互联网是非常多的安装文档.而且也没有细挑的版本号.因为我觉得python2.6 可能相对保守一些,至少之前用到的版本号是这个.所以此处依旧 ...

  7. 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo

    原文:返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo [索引页] [源码下载] 返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo 作者 ...

  8. 先学习Oracle 11g的Automatic Diagnostic Repository新功能

    Oracle 11g之前.当数据库出现故障,通常情况下,第一次需要看alert刊物.什么,看看哪些记录错误,您可以给我们的提示.alert文件名 是alert_<ORACLE_SID>.l ...

  9. MySQLHA系列MHA(一)

    MHA,这是Master High Availability Manager and Tools for MySQL,一个日本MySQL专家们使用Perl语言编写的一个脚本管理工具.该工具仅适用于My ...

  10. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...