zoukankan      html  css  js  c++  java
  • Spring事务管理(二)

    首先看一段源码org.springframework.transaction.PlatformTransactionManager中的方法的定义

    TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
                throws TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;

    可以知道在spring事务管理SPI(Service Provider Interface)的抽象层主要包含三个接口:分别是

    PlatformTransactionManager,TransactionDefinition,TransactionStatus.

    TransactionDefinition主要定义了事务的隔离级别和事务的传播行为.

    TransactionStatus代表一个事务的具体运行状态.事务管理器可以通过该接口获取事务运行期的状态信息,也可以通过该接口间接的回滚事务.它相比于在抛出异常时会滚事务的方式更具可控性.

    事务 说明
    JpaTransactionManager 使用Jpa持久化时,使用该事务管理器
    HibernateTransactionManager 使用Hibernate版本进行持久化时,使用该事务管理器
    DataSourceTransactionManager 使用SpringJDBC或Mybatis等基于DataSource数据源持久化时,使用该事务管理器
    JdoTransactionManager 使用JDO进行持久化时,使用该事务管理器
    JtaTransactionManager 具有多个数据源的全局事务使用该事务管理器(不管采用何种持久化技术)

    1:使用SpringJDBC或MyBatis

            <context:property-placeholder location="classpath:jdbc.properties"/>
           
            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
                p:driverClassName="${jdbc.driverClassName}"
                p:url="${jdbc.url}"
                p:userName="${jdbc.userName}"
                p:password="${jdbc.password}"/>
            
            <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
            p:dataSource-ref="dataSource"/>
            

    2:JPA

     <context:property-placeholder location="classpath:jdbc.properties"/>
           
            <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
                p:driverClassName="${jdbc.driverClassName}"
                p:url="${jdbc.url}"
                p:userName="${jdbc.userName}"
                p:password="${jdbc.password}"/>
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
                p:dataSource-ref="dataSource"/>
            <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
                p:entityManagerFactory-ref="entityManagerFactory"/>

    3:Hibernate不记

    4:JTA

    后续补充更详细的配置;

                                事务传播行为类型:

    事务传播行为类型 说明

    PROPAGATION_REQUIRED=0

    如果没有当前事务,则新建一个事务;如果已经存在一个事务,则加入到这个事务中,这是最常见的选择

    PROPAGATION_SUPPORTS=1

    支持当前事务,如果没有当前事务,则以非事务方式执行

    PROPAGATION_MANDATORY=2

    使用当前的事务.如果当前没有事务则抛出异常.

    PROPAGATION_REQUIRES_NEW=3

    新建事务,如果当前存在事务,则把当前事务挂起.

    PROPAGATION_NOT_SUPPORTED]=4

    以非事务的方式执行操作,如果当前存在事务,则把当前事务挂起.
    P

    PROPAGATION_NEVER=5

    以非事务的方式执行操作,如果当前存在事务,则抛出异常,

    PROPAGATION_NESTED=6

    如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

    注:在使用PROPAGATION_NESTED时,底层的数据源必须基于JDBC3.0;并且实现者需要支持保存点事务机制.

    编程式的事务管理:org.springframework.transaction.support.TransactionTemplate

  • 相关阅读:
    C++基类的析构函数定义为虚函数的原因
    android的学习网站
    QT显示url图片
    Ubuntu安装JDK
    linux下打包压缩和解压命令
    嵌入式目录
    QT pri 文件的作用
    QT pro文件详细写法+实例
    Computer(树的直径做法)
    树的直径
  • 原文地址:https://www.cnblogs.com/xibushijie/p/12874980.html
Copyright © 2011-2022 走看看