上一篇博客讲解了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自带的事务管理器,一般很少出现自己去添加

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

Spring配置xml自定义事务管理器的更多相关文章

  1. spring配置多个事务管理器

    <tx:annotation-driven/> <bean id="transactionManager1" class="org.springfram ...

  2. Spring3.0配置多个事务管理器(即操作多个数据源)的方法

    大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义 ...

  3. spring 配置事务管理器

    在Spring中数据库事务是通过PlatformTransactionManager进行管理的,jdbcTemplate是不能支持事务的,而能够支持事务的是org.springframework.tr ...

  4. spring的annotation-driven配置事务管理器详解

    http://blog.sina.com.cn/s/blog_8f61307b0100ynfb.html ——————————————————————————————————————————————— ...

  5. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

  6. 跟我学Spring3(9.2):Spring的事务之事务管理器

    原文出处: 张开涛9.2.1 概述 Spring框架支持事务管理的核心是事务管理器抽象,对于不同的数据访问框架(如Hibernate)通过实现策略接口PlatformTransactionManage ...

  7. Spring jdbctemplate和事务管理器 全注解配置 不使用xml

    /** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans ...

  8. 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题

    问题描述: Error occured processing XML 'org/aopalliance/intercept/MethodInterceptor'. See Error Log for ...

  9. spring事务管理器的源码和理解

    原文出处: xieyu_zy 以前说了大多的原理,今天来说下spring的事务管理器的实现过程,顺带源码干货带上. 其实这个文章唯一的就是带着看看代码,但是前提你要懂得动态代理以及字节码增强方面的知识 ...

  10. Spring事务管理器

    1.创建实体和接口 public class Bank { private Integer id; private String name; private String manay; public ...

随机推荐

  1. 小白学k8s(4)使用k8s发布go应用

    k8s发布go应用 前言 部署 镜像打包 编写yaml文件 使用ingress 什么是ingress呢 ingress与ingress-controller ingress 部署ingress 配置i ...

  2. QAnything本地知识库问答系统:基于检索增强生成式应用(RAG)两阶段检索、支持海量数据、跨语种问答

    QAnything本地知识库问答系统:基于检索增强生成式应用(RAG)两阶段检索.支持海量数据.跨语种问答 QAnything (Question and Answer based on Anythi ...

  3. 热门数据集提供【MNIST、鸢尾花、猫狗、CIFAR10、vegetables、Ox-Flowers17、pascalvoc】

    热门数据集提供[MNIST.鸢尾花.猫狗.CIFAR10.vegetables.Ox-Flowers17.pascalvoc] 简介: 鸢尾花数据集: 约150条数据,每条样本4个属性,共3个类别 M ...

  4. 时间工具类-Java

    1.根据传入时间获取该时间所在季度的第一天 /** * 根据传入时间获取传入日期所在季度的第一天的日期 * * @param startDate * @return */ public static ...

  5. Mybatis(一对一、一对多、多对多)操作

    * 首先列出示例中用到的数据库表 user表: accout表: role表: user_role表: 建表语句如下: DROP TABLE IF EXISTS `user`; CREATE TABL ...

  6. ElasticSearch7.3学习(十六)----RestHighLevelClient Java api实现索引的创建、删除、是否存在、关闭、开启

    1.写在前面 注意:导入的包区别,不同的包创建索引的方式不同.博主亲身实践,具体体现在createIndexRequest.mapping()里面.读者可自行试验. import org.elasti ...

  7. 蓝鲸:主机频繁提示“You have new mail in /var/spool/mail/root” 定位解决

    前些天安装蓝鲸的测试环境频繁出现You have new mail in /var/spool/mail/root,查看发现是/usr/local/gse/agent/bin/gsectl: line ...

  8. Winows11-hosts文件无法修改保存

    Win11系统hosts文件无法修改保存 新近使用win11新电脑修改hosts,添加IP和主机名映射,保存时提示host无法修改. 解决办法: 1.将hosts文件的权限"只读" ...

  9. JS Leetcode 304. 二维区域和检索 - 矩阵不可变,彻底弄懂二维数组前缀和

    壹 ❀ 引 我在JS LeetCode 303. 区域和检索 - 数组不可变,一维数组的前缀和一文中,记录了一维数组求区间合的解题思路,正好还有一题的升级版,题目来自leetcode304. 二维区域 ...

  10. NEMU PA 2-2 实验报告

    课程地址:https://www.bilibili.com/video/BV1f7411D7P6 一.实验目的 在PA2-1中,我们实现了了解了程序的装载和对指令的解码和执行,在这一章节我们将继续深入 ...