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对象(代码片段