Spring配置xml自定义事务管理器

发布时间 2023-06-12 00:01:04作者: 一只爱阅读的程序员

  上一篇博客讲解了Spring配置xml事务,使用的是Spring框架提供的事务管理器。

在本篇博文当中,来讲解一下使用自定义的事务管理方式。

把上一篇博文当中的这个配置

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

</bean>

修改为如下的配置:

    <bean id="transactionManager" class="com.cat.aop.TransactionAdvice">

        <property name="ds" ref="dataSource"/>

    </bean>

 

这部分代码注销:

<tx:advice id="txAdvice" transaction-manager="transactionManager">

        <!-- 事务属性 -->

        <tx:attributes>

            <tx:method name="*"/>

            <tx:method name="get*" read-only="true"/>

            <tx:method name="find*" read-only="true"/>

            <tx:method name="list*" read-only="true"/>

 

            <!--增删改 -->

            <tx:method name="insert*" timeout="5000" rollback-for="java.lang.Exception"/>

            <tx:method name="add*" timeout="5000"/>

            <tx:method name="update*" timeout="5000"/>

            <tx:method name="delete*" timeout="5000"/>

        </tx:attributes>

    </tx:advice>

因为使用aop进行拦截,就不在需要上面的代码。

 

aop:config的配置修改为:

  <aop:config>

        <!-- 正确配置方式 -->

        <aop:pointcut id="pt" expression="execution(* com.cat.service.impl.CatServiceImpl.*(..))"/>

        <aop:aspect ref="transactionManager">

            <aop:around method="tranAround" pointcut-ref="pt"/>

        </aop:aspect>

    </aop:config>

添加一个自定义事务管理TransactionAdvice类的代码如下

public class TransactionAdvice {

    private DataSource ds;

 

    public void setDs(DataSource ds) {

        this.ds = ds;

    }

 

    public TransactionAdvice() {

    }

 

    public TransactionAdvice(DataSource ds) {

        this.ds = ds;

    }

 

    public Object tranAround(ProceedingJoinPoint pj) throws Throwable {

 

        //开启事务 (

        //事务管理器

        DataSourceTransactionManager ptm = new DataSourceTransactionManager();

        //事务管理器中,需要注入 dataSource

        ptm.setDataSource(ds);

        //声明事务

        TransactionDefinition td = new DefaultTransactionDefinition();

        //事务状态

        TransactionStatus ts =ptm.getTransaction(td);

 

        Object obj=pj.proceed();

 

        ptm.commit(ts);

 

        return obj;

    }

}

注意这个类中ds需要和

<bean id="transactionManager" class="com.cat.aop.TransactionAdvice">

        <property name="ds" ref="dataSource"/>

</bean>

这个位置的一致。

执行前的数据为:

 

 

运行后的结果为

 

 

再次查看数据库,刷新后的结果如下

 

 

事务正确回滚,达到目的。

如果把10 / 0去掉,再次执行。

查看结果,执行成功,第一条数据名称修改成功,第二条数据物理删除成功!

 

至此自定义事务管理的整个流程全部打通。

真实的开发中,还是建议配置为Spring自带的事务管理器,一般很少出现自己去添加

自定义事务管理器的情况。各位小伙伴有其他更好建议的,欢迎留言。