Spring事务管理器
Spring事务管理器 配置与使用
Spring的事务管理器主要是实现PlatformTransactionManager
接口,Spring提供了8个实现类,但是最常用的DataSourceTransactionManager
,该类继承了ManagerAbstractPlatformTransactionManager
类且ManagerAbstractPlatformTransactionManager类实现了PlatformTransactionManager接口。PlatformTransactionManager接口中有三个方法。一旦配置了事务管理器,事务将交由数据库事务管理器管理事务,不在使用jdbcTemplate来管理管理事务。
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;//获取事务的状态
void commit(TransactionStatus status) throws TransactionException;//进行事务的提交
void rollback(TransactionStatus status) throws TransactionException;//出现异常或着错误时进行事务回滚
-
XML方式
配置事务管理器-
配置时需要在xml配置文件中加入事务管理的命名空间
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
-
配置事务管理器需要为事务管理器注入当前配置的数据源组件
<!--需要在xml配置文件中<beans>元素下添加一下内容--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--ref ="dataSource" dataSource是数据源配置时的id--> <property name="dataSource" ref="dataSource"/> </bean>
-
-
java编码方式
配置Spring事务管理器-
在配置类需要标注
@Configuration
、@ComponentScan("包的限定名.*")
、@EnableTransactionManagement
(事务驱动管理器)。来告诉Spring这个类是用来配置事务管理器的.此外我们还需要实现TransactionManagementConfigurer接口中的annotationDrivenTransationManager方法。 -
@Configurer @ComponentScan("com.nubi.xxx.*") @EnableTransactionManagement public class TransactionConfig implements TransactionManagementConfigurer{ //数据源 private DataSource dataSource = null; //配置数据源 @Bean(name="dataSource") public DataSource initDataSource(){ if(dataSource != null) return dataSource; //数据源的properties Properties props = new Properties(); //配置的数据源参数 //创建数据源 try{ dataSource = BasicDataSourceFactory.createDataSource(props); }catch(Exception e){ e.printStackTrace(); } return dataSource; } //配置jdbcTemplate @Bean(name="jdbcTemplate") public jdbcTemplate initjdbcTemplate(){ jdbcTemplate jt = new jdbcTemplate(); jt.setDataSource(initDataSource()); return jt; } //实现接口的方法,返回数据库事务管理器 @Bean(name="transactionManager") public PlatformTransactionManager annotationDrivenTransationManager(){ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(initDataSource()); return transactionManager; } }
-
需要注意的是,使用了注解@EnableTransactionManagement,在Spring上下文中使用事务注解@Transactional后,Spring就知道使用上面配置的数据源的数据库事务管理器区管理事务。
-
-
编程式
事务 -
声明式
事务 -
数据库相关的知识
-
选择事务
隔离级别
和传播行为
-
选择隔离级别
-
传播行为(传播机制 propagation)
- REQUIRED:默认值,若存在一个事务,就支持当前存在的这个事务;否则开启一个新的事务。
- REQUIRES_NEW:总是开启一个新的事务,若存在事务,挂起存在的事务。开始新的事务执行方法。
- MANDATORY:若存在一个事务,就支持该事务;若当前没有一个活动的事务,就抛出异常。
- NESTED:若当前存在一个事务,则创建一个事务作为当前事务的一个嵌套事务运行;若没有事务,该传播行为与REQUIRED一致。
- SUPPORTS:若当前事务不存在则以非事务方式执行,否则支持当前事务。
- NOT_SUPPORTED:总是以非事务方式执行。若事务存在,则挂起当前事务,然后在执行方法。
- NEVER:总是以非事务的方式执行。若存在一个活动的事务,就抛出异常
-
配置事务管理器的事务属性
<!--transaction-manager该属性是指定事务管理,如果Transaction的Bean的name值"transactionManager"可以省略,因为这是transaction-manager属性的默认值--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--name属性是必须的,用来指定匹配的方法。可以使用通配符“*”进行匹配符合规则的方法。 可以配置多个<tx:method/>标签 表示以find开头的方法--> <tx:method name="search*" propagation="SUPPORTS"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="create*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
-
还可以通过注解方式对方法进行配置传播行为
@Transaction(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED) public int createUsers(List<User> users){ //代码。。。 }
-
-
Spring与Mybatis
组合使用事务 -
@Transactional
的自调用时效问题
上一篇: Spring 框架系列之事务管理
推荐阅读
-
使用Spring Security控制会话的方法
-
Spring Boot报错:No session repository could be auto-configured, check your configuration的解决方法
-
详解Spring极速集成注解redis实录
-
Spring Boot + Vue 前后端分离开发之前端网络请求封装与配置
-
spring整合atomikos实现分布式事务的方法示例
-
spring IOC容器 Bean管理(基于注解方式)
-
eclipse怎么打开项目资源管理器(eclipse资源管理器操作方式)
-
Spring的配置,XML提示的配置,Bean的相关配置
-
自己动手在Spring-Boot上加强国际化功能的示例
-
浅析Spring Boot中的spring-boot-load模块