Spring系列博客:Spring事务管理(二)--事务管理内容

   上一篇博客中,我们了解了事务的基本概念和多个事务并发运行时可能导致的问题。下面这一篇博客具体介绍一下Spring事务管理的具体内容

1、Spring事务核心接口

    Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略
    Spring事务管理中,主要的核心实现为org.springframework.transaction.PlatformTransactionManager接口。具体如下图
Spring事务管理
   TransactionDefinition:规范事务的特定表现形式
    TransactionStatus:事务运转的状态形式
    PlatformTransactionManager:根据给定的规则获取事务现有状态的具体表现,进行具体操作

2、事务特性

    由上图,我们可以看出TransactionDefinition就是用来指定事务特性的。包含了以下内容
 
    2.1事务传播行为
 
    当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事物,并在自己的事务中运行,spring定义了七种传播行为:

PROPAGATION_REQUIRED:当前方法必须在事务中运行,如果有当前事务环境就加入当前正在执行的事务环境,如果没有,则新建一个事务。此选项为默认值

PROPAGATION_SUPPORTS:如果当前存在事务环境,该方法就加入事务中执行。如果当前没有事务,就以非事务的方式执行

PROPAGATION_MANDATORY:当前方法必须在事务中运行,如果当前没有事务,就抛出异常

PROPAGATION_REQUIRES_NEW:当前方法总是会为自己发起一个新的事务,如果当前方法已经运行在一个事务中,则原有事务被挂起,创建一个属于自己的事务,直到自身的事务commit结束,原有的事务才会恢复执行

PROPAGATION_NOT_SUPPORTED:当前方法总是以非事务方式进行操作。如果当前存在事务,就把当前事务挂起,等该方法以非事务的状态运行完成,再继续原来的事务

PROPAGATION_NEVER:当前方法总是以非事务方式进行操作。如果方法在事务范围内执行,容器则抛出异常

PROPAGATION_NESTED:当前方法执行时,如果已经有一个事务存在,则以嵌套事务的方式运行在当前事务中。子事务可以单独的进行回滚操作,不会对父事务造成影响。但是子事务要受父事务的影响

    2.2隔离级别
 
    隔离级别定义了一个事务可能受其他并发事务影响的程度。TransactionDefinition接口定义了五个表示隔离级别的常量:

ISOLATION_DEFAULT:采用数据库默认隔离级别

ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

ISOLATION_READ_COMMITTED:大多数主流数据库的默认事务等级。保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了脏读。该级别使用与大多数系统。

ISOLATION_REPEATABLE_READ:保证一个事务不会修改已经由另一个事务读取但为提交(回滚)的数据,也就是对同一字段在同一事务中多次读取的结果都是一致的。避免了脏读和不可重复读的情况,但是带来了更多的性能损耗。

ISOLATION_SERIALIZABLE:最严格的级别,事务串行执行,资源消耗最大。

    2.3事务超时
 
    事务超时指的是设置事务执行的最长时间,如果超过时间事务还没有执行完成便立即回滚该事务。在 TransactionDefinition 中以 int 的值来表示超时时间,单位是秒。
 
    2.4事务只读属性
 
    事务只读,是指操作数据库时,只进行读取操作,而不会做相应的修改。只读属性并不是强制性的选项,而是一种优化配置。它将只读配置信息传递给数据库,以期待数据库会对其做一些特定化的优化。例如,不安排相应的数据库锁,以减轻事务对数据库的压力等。
 
    2.5事务回滚规则
 
    默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。
    PS:RuntimeException + Error 和其子类都是属于 uncheck exception
Exception类中除了 RuntimeException之外的类 都是属于 check exception。

3、事务管理器

 
    从图中可以看出,spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
 
   3.1DataSourceTransactionManager
 
    DataSourceTransactionManager主要用于由JDBC直接持久化数据的情况,例如MyBatis等。它通过调用java.sql.connection来管控事务,并且指定相应的DataSource。但是这并不意味着Connection具备事务功能,它仅仅是将commit,rollback等命令传递给数据库,由数据库本身的事务进行管理。并且像commit,rollback等事务功能和执行SQL的业务功能必须使用同一个Connection,才能真正实现事务管控的功能。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
</bean>

   3.2HibernateTransactionManager
    HibernateTransactionManager主要用于由Hibernate框架持久化数据的情况。它将事务功能和业务分隔开来,由Hibernate自身的Transaction来管理事务,使职责更为分明清晰。

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
</bean>

    3.3JpaTransactionManager
    JpaTransactionManager主要使用于通过java持久化API来持久化数据的情况。它需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现),并且JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
</bean>

    3.4JtaTransactionManager
    JtaTransactionManager主要使用于包含多个数据源的分布式事务管控。

4、@Transactional

    @Transactional注解可以作用在接口,接口方法,类以及类方法上。当作用在类上时,该类所有的public方法都将具有该类型的事务属性。作用在方法上的标注将覆盖类级别的定义。
    注:在Spring中,建议不要在接口或接口方法上使用该注解。因为spring的代理方式分为基于接口的代理和基于类实现的代理,只有当Spring在使用基于接口的代理时,注解才会生效。另外,@Transactional注解应该只被应用到public方法上,这是由Spring AOP本质决定的。应用在非public方法上,注解会被忽略,也不会抛出异常。

5、编程式事务和声明式事务

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值