Transactional 被嵌套方法方法事务不生效

<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="
       http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-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/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
    <!-- 自动扫描(自动注入),扫描这个包以及它的子包的所有使用@Service注解标注的类 -->
    <context:component-scan base-package="com.ctl.*.service" />
    <!-- JNDI方式配置数据源 -->
    <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiName" value="${jndiName}"></property></bean> -->
    <!-- ========================================配置数据源========================================= -->
    <bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:config.properties"/>
    </bean>
    <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="0" />
        <!-- 连接池最大使用连接数量 -->
        <property name="maxActive" value="20" />
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="20" />
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="0" />
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="60000" />
        <!-- 
        <property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> 
        -->
        <property name="validationQuery" value="${jdbc.validationQuery}" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="testWhileIdle" value="true" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="25200000" />
        <!-- 打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true" />
        <!-- 1800秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800" />
        <!-- 关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true" />
        <!-- 监控数据库 -->
        <!-- <property name="filters" value="stat" /> -->
        <property name="filters" value="mergeStat" />
    </bean>
    <!-- ========================================分隔线========================================= -->
    <!-- ========================================针对myBatis的配置项============================== -->
    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描me/gacl/mapping/目录下的所有SQL映射的xml文件, 省掉Configuration.xml里的手工配置
        value="classpath:me/gacl/mapping/*.xml"指的是classpath(类路径)下me.gacl.mapping包中的所有xml文件
        UserMapper.xml位于me.gacl.mapping包下,这样UserMapper.xml就可以被自动扫描
         -->
        <property name="mapperLocations" value="classpath:/mapper/*Mapper.xml"/>
        <property name="typeAliasesPackage" value="com.ctl.model.wisedo"/>
        <property name="configLocation" value="classpath:config/mybatis_config.xml"/>
    </bean>
    <!-- 配置扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描me.gacl.dao这个包以及它的子包下的所有映射接口类 -->
        <property name="basePackage" value="com.ctl.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
    <!-- ========================================分隔线========================================= -->
    <!-- 配置Spring的事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 注解方式配置事物 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <aop:aspectj-autoproxy expose-proxy="true"/>

@Service
public class TransactionServiceImpl {
    @Autowired
    private BannerMapper bannerMapper;

    public BaseDTO  addBanner( ) {
        Banner banner = new Banner();
        banner.setId(UUID.randomUUID().toString().substring(0,21));
        banner.setRemarks("test");
        //    <aop:aspectj-autoproxy expose-proxy="true"/> 这样才可以使用,否则直接调用addBannerDo方法事物不生效
        int i = ((TransactionServiceImpl)AopContext.currentProxy()).addBannerDo(banner);
        System.out.println(banner);
        int k=0/100;
        return null;
    }
    @Transactional
    public int addBannerDo( Banner banner){
        int i = bannerMapper.insertSelective(banner);
        System.out.println(i);
        return i;
    }
}
public class Test {
    public static void main(String[] args) {
        ApplicationContext context= null;// new ClassPathXmlApplicationContext("spring/applicationContext.xml");
        context=  new ClassPathXmlApplicationContext("classpath:test-spring-mybatis.xml");
        for (int i = 0; i <  context.getBeanDefinitionNames().length; i++) {
            System.out.println( context.getBeanDefinitionNames()[i]);
        }
        TransactionServiceImpl transactionServiceImpl = (TransactionServiceImpl) context.getBean("transactionServiceImpl");
        transactionServiceImpl.addBanner();

    }
}
发布了193 篇原创文章 · 获赞 67 · 访问量 46万+

猜你喜欢

转载自blog.csdn.net/CTLLIN/article/details/86245522