关闭

Spring事务管理

标签: spring事务
130人阅读 评论(0) 收藏 举报
分类:

事务是数据库中的概念,spring支持两种方式的事务管理:
编程式,声明式。


1. 事务中的API介绍

主要是3个接口,

  1. PlatformTransactionManager事务管理器
    Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现,就是提供该接口来实际的管理数据库。
  2. TransactionDefinition事务定义信息(隔离级别,传播,超时时间,只读)
  3. TransactionStatus事务具体运行状态(是否提交等)

具体内容可以参考Spring手册。

总的来说就是:PlatformTransactionManager根据PlatformTransactionManager中的定义来管理事务,管理状态保存到TransactionStatus中。


2. 编程式实现

spring提供了一个事务管理的模板,只需要将事务管理器引入到该模板即可:在xml文件中

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

    <!-- 配置事务管理模板:spring为了简化事务管理的代码而提供的类 -->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"></property>
    </bean>

在service层的类中:

@Override
    public void transfer(final String out, final String in, final int money) {

        transactionTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

                accountDao.out(out, money);
                int i = 1/0;
                accountDao.in(in, money);

            }
        });

    }

3. 声明式实现

声明式的事务管理,又分为3种

  • 基于TransactionProxyFactoryBean的方式,该方法有个缺点:一次声明只能对一个目标进行增强,不利于维护,因此不常用。
<!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置业务层的代理 -->
    <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!-- 配置目标对象 -->
        <property name="target" ref="accountService"></property>
        <!-- 注入事务管理器 -->
        <property name="transactionManager" ref="transactionManager"></property>
        <!-- 注入事务的属性 -->
        <property name="transactionAttributes" >
            <!-- 用props注入Properties类型对象 -->
            <props>
                <!-- 
                    prop的格式
                        * PROPAGATION   : 事务的传播行为
                        * ISOLATION     : 事务的隔离级别
                        * readOnly      : 只读(不能进行修改,删除)
                        * -Exception    : 发生哪些异常事务回滚
                        * +Exception    : 发生哪些异常事务不回滚
                 -->
                <prop key="transfer">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop>
            </props>
        </property>
    </bean>
  • 基于AspectJ的xml方式:AspectJ是一个AOP开发框架,用AspectJ的优点是在业务类上不需要添加任何其他注解
<!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置事务的通知:(事务的增强) -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager" >
        <tx:attributes>
            <!-- 
                propagation : 事务传播行为
                isolation   : 事务隔离级别
                read-only
                rollback-for
                no-rollback-for
                timeout
             -->
            <tx:method name="transfer" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>


    <!-- 配置AOP的切面 -->
    <aop:config>
        <!-- 配置切入点  -->
        <aop:pointcut expression="execution(* demo3.AccountService+.*(..))" id="pointcut1"/>
        <!-- 配置切面 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
    </aop:config>
  • 基于注解的方式,在xml文件配置开启注解事务即可,配置简单,但需要在哦业务层类上添加@Transactional注解
<!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 开启注解事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

在业务层类上:

@Transactional(propagation=Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService{

总结一下AOP的基本过程:
配置增强方式—->找到切入点——>在切入点定义切面

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Spring事务管理(详解+实例)

写这篇博客之前我首先读了《Spring in action》,之后在网上看了很多关于Spring事务管理的文章,具体参考文章如下: 1、将相应的接口依赖图理清出 2、将每个类的具体配置弄明白 3、将具体的配置给出来 4、给出具体的例子(一个声明式的一个编程式的)
  • Trigl
  • Trigl
  • 2016-03-25 23:20
  • 26591

Spring事务管理及几种简单的实现

事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,最为典型的就是银行转账的案例:A要向B转账,现在A,B各自账户中有1000元,A要给B转200元,那么这个转账就必须保证是一个事务,防止中途因为各种原因导致A账户资金减少而B账户资金未添加,或者B账户资金添加而A账户资金未减少,这样不是用户...
  • zhuxinquan61
  • zhuxinquan61
  • 2017-05-01 22:30
  • 2653

Spring事务管理详解

Spring事务管理详解
  • donggua3694857
  • donggua3694857
  • 2017-04-09 22:43
  • 2765

Spring+Hibernate整合时关于Hibernate事务管理的问题

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session i...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016-11-28 19:03
  • 635

Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getConnection() 2. 开启事务conn.setAutoCommi...
  • u012358984
  • u012358984
  • 2014-01-19 00:53
  • 6741

Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = DriverManager.getConnection() 2. 开启事务conn....
  • JIESA
  • JIESA
  • 2016-05-04 15:57
  • 2826

Spring Boot中的事务管理

Spring Boot中的事务管理  2016-05-27  Spring Boot 被围观 4044 次 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行...
  • baochanghong
  • baochanghong
  • 2017-01-06 11:04
  • 655

springmvc事务管理详解

spring可以支持编程式事务和声明式事务。 Spring使用事务管理器,每个不同平台的事务管理器都实现了接口:PlatformTransactionManager 此接口是事务管理的核心,提供了三个需要实现的函数: [java] view plain...
  • Cherry_tly
  • Cherry_tly
  • 2016-04-28 14:49
  • 9400

spring事务管理配置

Spring事务主要有两种配置方式:一种是基于注解配置,另一种是基于配置文件。 1.     注解配置 1)    Spring配置文件 首先需要在spring配置文件当中添加事务管理容器: &...
  • baoq_v5_java
  • baoq_v5_java
  • 2015-04-13 11:31
  • 5545

Spring整理系列(17)————循序渐进了解spring事务管理的几种方式

先从实例开始。。。。一、实例基本业务为银行转账,A账户向B账户转账,业务执行过程要保证A、B两个帐号数据操作同时成功或失败,此时就需要事务进行控制,基本实例代码如下:转账DAO:public interface AccountDao { //转出操作 public void outM...
  • javaloveiphone
  • javaloveiphone
  • 2016-08-22 10:41
  • 2351