Spring事务管理

Posted xibushijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Spring事务管理的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

使用 Git 来管理 Xcode 中的代码片段