spring的事务管理笔记

标签: spring 管理 笔记 | 发表时间:2013-12-16 18:08 | 作者:alexqdjay
出处:http://www.iteye.com

 

Spring事务的介绍

 

首先,事务管理是保证数据操作的事务性 ACID(即原子性、一致性、隔离性、持久性)。

 

       对于使用支持事务管理的数据库时,普通的jdbc的连接没用配置事务也可以保存变更,原因在于连接的属性autocommit设置了true,即自动提交了事务。

 

       而对于某些数据库本身没有对事务的支持,那么事务管理也是一纸空谈没有必要进行配置(有例外),如MySQL的MyISAM没有事务管理的支持。但是如果使用了有自身事务管理的框架如Hibernate的话可以变向地实现事务管理(由于Hibernate的一级缓存,我们在操作update和save等时,它不会向数据库提交数据,而是等我们调用commit或者flush一级缓存的数据时才会提交更改)。

 

       所谓的事务的传播或者说嵌套通俗地说就是,事务方法的互相调用。spring提供了七中传播行为:

  1. PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
  2. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。
        spring在多线程情况下的事务管理遵循如下规则,在同一线程中遵守规定的事务传播方式,在不同的线程中各自独立地管理自己的事务。
 
Spring混合事务的管理
        几个常用的事务管理器
Hibernate Spring JDBC 或 iBatis HibernateTransactionManager
JPA Spring JDBC 或 iBatis JpaTransactionManager
JDO Spring JDBC 或 iBatis JdoTransactionManage

 

       即使用jpa又使用jdbc(JPA+JDBC)称为混合事务,在Spring AOP的事务增强的情况下,混合事务仍然会保持事务的一致,即混合技术但唯一事务。

       但是在使用Hibernate时由于一级缓存的存在必须flush()一级缓存,因为其他框架是感知不到他的一级缓存。

       

       Spring的事务增强是在aop的基础上的,所以aop覆盖不到的方法即不能有Spring的事务管理。

  1.       基于接口的动态代理,除public外其他所有的方法都不能被覆盖包括 public static
  2.        基于cglib的动态代理,static、private、final都不能被覆盖
       但是由于private方法肯定是被public调用才能对外可见,所以private方法依然享有public的事务管理。
JDBC的连接泄露
       获取的connection的方式很多,例如 datasource的获取,通过 DataSourceUtils获取,或者使用 TransactionAwareDataSourceProxy 获取 后面两种获取方法在效果上是一致的所以归并为一类(后文称 B方法),而直接获取的是另一类(后文称为 A方法)。直接获取的,在事务管理方法中表现出开启两个连接(Spring在事务管理方法中存在一个事务上下文,并同一个数据源绑定唯一一个连接,所有事务上下文传播的方法共享这个链接,加上直接获取的连接即为两个连接同时开启),另一种则只是获取了该方法的事务连接所以表现出只开启了一个连接。直接获取的在方法执行完毕后会泄露一个连接,所以必须显式地关闭连接 connection.close()。B方法在存在事务上下文的情况下不必显式地关闭连接,但是没有事务的情况下由于获取方式其实也是直接datasource获取所以也必须显示地关闭连接。
        JDBCTemplate内部也是使用 DataSourceUtils获取的连接,但是jdbcTemplate都作显式关闭以防没有上下文的情况。从另个侧面也说明了jdbcTemplate的连接跟事务连接是同一个,所以混合事务管理时才开启一个事务。
       
 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring 管理 笔记] 推荐:

spring的事务管理笔记

- - 企业架构 - ITeye博客
首先,事务管理是保证数据操作的事务性 ACID(即原子性、一致性、隔离性、持久性).        对于使用支持事务管理的数据库时,普通的jdbc的连接没用配置事务也可以保存变更,原因在于连接的属性autocommit设置了true,即自动提交了事务.        而对于某些数据库本身没有对事务的支持,那么事务管理也是一纸空谈没有必要进行配置(有例外),如MySQL的MyISAM没有事务管理的支持.

Spring笔记 - Spring Expression Language (SpEL表达式)

- - CSDN博客架构设计推荐文章
数字5       . 联合方式  . 浮点型      .

Spring Batch学习笔记

- - 博客园_首页
  和传统的批处理(Batch Processing)相比,Spring Batch虽然有很大的不同,但是归根结底,都是顺序地执行一些列任务. 你用Spring Batch可以读取一个TXT文件的内容,然后将处理之后的数据放到数据库里,反之亦然.    Spring Batch任务处理的核心组件有Job、Step、Tasklet、JobLuncher和JobRepository等.

spring面试笔记(转)

- - CSDN博客推荐文章
一、spring工作原理:. 1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作. 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller.

Spring Data JPA,基础学习笔记.

- - ITeye博客
最好先学习 JPA 方面的知识....在这里使用的是 Hibernate. 也已经使用了一段时间,看什么都不如看官方文档,我这里也只是写个笔记记录一下,如果能帮助到其他人,很开心 .算是个 demoshow 吧.这里也只写了一些我觉得比较有用的地方.其他一些使用知识,请参见官方文档:http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/.

spring cloud stream使用笔记 - 简书

- -
以前我们在spring boot中构建一个消息驱动的微服务应用,通常会使用rabbitMQ或是kafka来做消息中间件,应用中均需代码实现具体消息中间件的通信细节. 此时如果再更换一个新的消息中间件,这会我们又需新增这些通信代码,写起来会比较繁琐,而stream出现就是为了简化这一过程. 它是一个构建消息驱动的微服务应用的框架.

spring+hibernate+atomikos 分布式事务管理

- - 企业架构 - ITeye博客
网上有很多的atomikos的分布式事务管理的配置,但是大多数都是同一类型的数据库,并没有跨数据库类型的配置. 使用的数据库是Oracle和mysql. . .

Spring+quartz 实现动态管理任务

- - 寒江孤影
在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合实现动态的改变定时任务的状态的一个实现. 本文章适合对quartz和spring有一定了解的读者.

Spring 事务管理的一个 trick

- - 码蜂笔记
最近有同事碰到这个异常信息: Transaction rolled back because it has been marked as rollback-only ,异常栈被吃了,没打印出来. 他期望的是 innerService.innerTx(ex); 调用即使失败了也不会影响 OutterService.outTx 方法上的事务,只回滚了 innerTx 的操作.

Spring MVC 学习笔记 json格式的输入和输出

- - Java - 编程语言 - ITeye博客
Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用. 先修改之前的helloworld.jsp,增加客户端json格式的数据输入. 根据前面的分析,在spring mvc中解析输入为json格式的数据有两种方式 1:使用@RequestBody来设置输入.