Spring事务应用

本文深入探讨了Spring框架中事务管理的常见误区,特别是关于事务回滚机制的配置细节。通过示例代码,展示了@Transactional注解及XML配置下,如何确保不同类型的异常都能触发事务回滚,以及大公司架构师在DAO层的通用配置策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring事务

一个经常忽略的问题

@Service
public class DemoService {
    @Autowired
    private PayMapper payMapper;
    @Transactional
    public void aaa() throws RuntimeException {
        Pay pay = new Pay();
        pay.setUserid(0L);
        pay.setChannel("");
        pay.setMoney(0);
        pay.setPaylevel(0);
        pay.setOrderid("ABCDEFG");
        pay.setTime(0L);
        payMapper.insert(pay);
        payMapper.insert(pay);
    }
}

 

 

此处,经常出现事务配置好了但是事务不生效的情况,看 @Transactional 注解中的说明可知,

默认回滚只针对,方法抛出RuntimeException 和 Error 生效

若不抛出或者用 Exception抛出都不会触发事务回滚

(为了说明换了一个,xml的配置展示清晰一点)

一般公司的架构师针对Dao层基本都做了的 rollback-for 的配置

所以有时候我们感觉Exception也可以抛出啊,其实都有大牛帮我们考虑到了。

感谢大牛!!

 

注解回滚配置: @Transactional(rollbackFor = {Exception.class,RuntimeException.class, SQLException.class})

声明式事务的两种配置

xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sharding="http://shardingjdbc.io/schema/shardingjdbc/sharding"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd
                        http://shardingjdbc.io/schema/shardingjdbc/sharding                        http://shardingjdbc.io/schema/shardingjdbc/sharding/sharding.xsd">
    <!--DruidDataSource (略)-->
 
    <!--事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource "/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:cn/joeg/demo/db/mapper/*.xml"/>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.joeg.demo.db.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

</beans>

 

 

annotation

@Configuration
@MapperScan(basePackages = "cn.joeg.demo.db.mapper")
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisConfig {

    @Autowired
    @Qualifier("dataSource")
    public DataSource dataSource;

    @Lazy(false)
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory localSessionFactoryBean() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
//        sqlSessionFactoryBean.setTypeHandlers(new TypeHandler[]{new TestTypeHandle(),new GPTypeHandler()});
//        sqlSessionFactoryBean.setPlugins(new Interceptor[]{new TestPlugin()});
//        sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageInterceptor()});
        SqlSessionFactory factory = sqlSessionFactoryBean.getObject();
        factory.getConfiguration().setLazyLoadingEnabled(true);
        factory.getConfiguration().setAggressiveLazyLoading(false);
        factory.getConfiguration().setProxyFactory(new CglibProxyFactory());
        return factory;
    }
    private PageInterceptor pageInterceptor() {
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.put("helperDialect", "mysql");
        pageInterceptor.setProperties(properties);
        return pageInterceptor;
    }



    @Primary
    @Lazy(false)
    @Bean(name = "sqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate() throws Exception {
        return new SqlSessionTemplate(localSessionFactoryBean(), ExecutorType.SIMPLE);
    }


    @Lazy(false)
    @Bean(name = "batchSst")
    public SqlSessionTemplate batchSst() throws Exception {
        return new SqlSessionTemplate(localSessionFactoryBean(), ExecutorType.BATCH);
    }

    @Bean(name = "txManager")
    public DataSourceTransactionManager dataSourceTransactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }

}

 

如何使用

没什么好讲的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值