Spring @Transactional 使用
Posted 一个攻城狮的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring @Transactional 使用相关的知识,希望对你有一定的参考价值。
Spring @Transactional是Spring提供的一个声明式事务,对代码的侵入性比较小,只需考虑业务逻辑,不需要把事务和业务搞混在一起。
@Transactional 可以注解在interface和class层面。由于注解在interface上的方法只能通过JDK Dynamic 来代理。注解在class上的方法Spring默认使用cglib来处理代理,但是局限于class中的public方法,对于非public的方法,如果标记了@Transactional也不会报错,但方法事务无效。这时需要引入Aspectj来处理代理这个方法事务。
Spring事务配置
一、xml方式
1.在Spring配置文件引入<tx:>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
2.配置基于注解的声明式事务管理,如果没有使用Hibernate框架,则将class替换成"org.springframework.jdbc.datasource.DataSourceTransactionManager"
<!-- 配置声明式事务管理器--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 注解驱动--> <tx:annotation-driven transaction-manager="txManager"/>
3.在要使用事务管理的类或者方法上增加代码@Transactional,Spring官方团队建议不要在接口使用。在类上使用@Transactional,类中的所有public方法都将使用事务
@Transactional public class Txtest implements TestService { }
在public方法上使用@Transactional,则该方法使用事务;非public方法使用@Transactional不会报错,但也不会使用事务,相当于“白做”。
@Transactional public List<Object> getAll() { return null; }
如果在类上使用@Transactional,但是类中的某个方法不想使用事务,则可以使用
@Transactional public class Txtest implements TestService { @Transactional(propagation = Propagation.NOT_SUPPORTED) public List<Object> getAll() { return null; } }
二、Java Config 方式
1、启用事务管理
@EnableTransactionManagement @SpringBootApplication public class WantuJuxinliApplication { public static void main(final String[] args) throws Exception { SpringApplication.run(WantuJuxinliApplication.class, args); } }
2、配置事务管理器 PlatformTransactionManager
@Configuration @MapperScan(basePackages = "com.xxx") public class DataSourceConfig { @Value("${db_driver}") private String driver; @Value("${db_url}") private String jdbcUrl; @Value("${db_username}") private String dbUser; @Value("${db_password}") private String dbPassword; @Bean(initMethod = "init", destroyMethod = "close") public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl(jdbcUrl); druidDataSource.setDriverClassName(driver); druidDataSource.setUsername(dbUser); druidDataSource.setPassword(dbPassword); druidDataSource.setMaxActive(20); druidDataSource.setInitialSize(1); druidDataSource.setMaxWait(60000); druidDataSource.setMinIdle(1); druidDataSource.setTimeBetweenEvictionRunsMillis(60000); druidDataSource.setMinEvictableIdleTimeMillis(300000); druidDataSource.setValidationQuery("SELECT ‘x‘"); druidDataSource.setTestWhileIdle(true); druidDataSource.setTestOnBorrow(false); druidDataSource.setTestOnReturn(false); druidDataSource.setPoolPreparedStatements(true); druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20); return druidDataSource; } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } @Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) { return new TransactionTemplate(transactionManager); } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource()); //分页插件 PageHelper pageHelper = new PageHelper(); Properties props = new Properties(); props.setProperty("reasonable", "true"); props.setProperty("supportMethodsArguments", "true"); props.setProperty("returnPageInfo", "check"); props.setProperty("params", "count=countSql"); pageHelper.setProperties(props); sessionFactory.setPlugins(new Interceptor[] { pageHelper }); sessionFactory.setFailFast(true); sessionFactory.setMapperLocations(resolver.getResources("classpath:/config/*Mapper.xml")); return sessionFactory.getObject(); } }
3、同xml方式第三点
--EOF--
以上是关于Spring @Transactional 使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中使用 @Transactional 注解
使用 Spring @Transactional 管理 Hibernate 事务
8 -- 深入使用Spring -- 6...3 使用@Transactional
透彻的掌握 Spring 中@transactional 的使用
何时使用 Spring @Transactional (propagation = Propagation.SUPPORTS)?