返回顶部
首页 > 资讯 > 后端开发 > Python >spring控制事务的三种方式小结
  • 431
分享到

spring控制事务的三种方式小结

2024-04-02 19:04:59 431人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录方式一:编码方式(需要修改源代码,基本不会用)方式二:xml配置(不需要改动代码,直接配置xml)方式三:注解spring是如何控制事务的?首先准备环境,目录结构如下 数据库准

首先准备环境,目录结构如下

数据库准备

业务层代码


@Service("accountService")
public class AccountServiceImpl implements AccountService {
	@Resource(name = "accountDao")
	AccountDao accountDao;
	public void transfer(Integer from, Integer to, Float money) {
		accountDao.subMoney(from,money);
                int i = 1/0;    //此处引发异常
		accountDao.addMoney(to,money);
	}
}

持久层代码


public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
	public void addMoney(Integer id, Float money) {
		getJdbcTemplate().update("update account set money=money+? where id=?", money , id);
	}
	public void subMoney(Integer id, Float money) {
		getJdbcTemplate().update("update account set money=money-? where id=?", money , id);
	}
}

测试代码


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
	@Resource(name="accountService")
	private AccountService accountService;
	@org.junit.Test
	public void test(){
		accountService.transfer(1,2,100f);
	}
}

运行结果

现在来用三种方式进行事务控制

方式一:编码方式(需要修改源代码,基本不会用)

添加事务管理类和事务模板类


    <!-- 事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
        <property name="dataSource" ref="dataSource" ></property>
    </bean>
    <!-- 事务模板对象 -->
    <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" >
        <property name="transactionManager" ref="transactionManager" ></property>
    </bean>

修改业务层代码


@Service("accountService")
public class AccountServiceImpl implements AccountService {
	@Resource(name = "accountDao")
	AccountDao accountDao;
	@Resource(name="transactionTemplate")
	private TransactionTemplate transactionTemplate;
	public void transfer(final Integer from, final Integer to, final Float money) {
		transactionTemplate.execute(new TransactionCallbackWithoutResult() {
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus status) {
				accountDao.subMoney(from,money);
				int i = 1/0;
				accountDao.addMoney(to,money);
			}
		});
 
	}
}

方式二:xml配置(不需要改动代码,直接配置xml)


<!-- 配置事务通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager" >
        <tx:attributes>
            <!-- 以方法为单位,指定方法应用什么事务属性
                isolation:隔离级别
                propagation:传播行为
                read-only:是否只读
             -->
            <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
            <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
        </tx:attributes>
    </tx:advice>
    <!-- 配置织入 -->
    <aop:config  >
        <!-- 配置切点表达式 -->
        <aop:pointcut expression="execution(* cn.swun.service.*ServiceImpl.*(..))" id="txPc"/>
        <!-- 配置切面 : 通知+切点
                 advice-ref:通知的名称
                 pointcut-ref:切点的名称
         -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc" />
    </aop:config>

方式三:注解

首先开启注解管理aop事务,然后打注解


    <!-- 开启使用注解管理aop事务 -->
    <tx:annotation-driven/>


@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void transfer(final Integer from, final Integer to, final Float money) {
	accountDao.subMoney(from,money);
	int i = 1/0;
	accountDao.addMoney(to,money);
}

spring是如何控制事务的?

Spring 的事务,可以说是 Spring AOP 的一种实现。

AOP面向切面编程,即在不修改源代码的情况下,对原有功能进行扩展,通过代理类来对具体类进行操作。

spring是一个容器,通过spring这个容器来对对象进行管理,根据配置文件来实现spring对对象的管理。

spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: spring控制事务的三种方式小结

本文链接: https://lsjlt.com/news/137546.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • spring控制事务的三种方式小结
    目录方式一:编码方式(需要修改源代码,基本不会用)方式二:xml配置(不需要改动代码,直接配置xml)方式三:注解spring是如何控制事务的?首先准备环境,目录结构如下 数据库准...
    99+
    2024-04-02
  • MySQL复制表的三种方式(小结)
    复制表结构及其数据 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。 create table table_name_new as ...
    99+
    2022-05-12
    MySQL 复制表
  • Spring配置数据源的三种方式(小结)
    目录一、前言三、开发数据源的方式方式1:手动输入方式2:Properties配置文件方式3:Spring配置数据源四、总结一、前言 今天学习了用spring配置Druid数据源的三种...
    99+
    2024-04-02
  • JUnit测试控制@Test执行顺序的三种方式小结
    目录JUnit测试控制@Test执行顺序第一种第二种(推荐)第三种Junit测试方法保证执行顺序当使用默认排序时JUnit测试控制@Test执行顺序 第一种 @FixMethod...
    99+
    2024-04-02
  • redis加锁的三种方式小结
    目录1 INCR2 SETNX3 SETredis常见的加锁命令分别是INCR、SETNX、SET 1 INCR 这种锁的加锁思路是:key不存在,那么key的值会先被初始化为0,然...
    99+
    2023-01-04
    redis 加锁
  • 基于spring boot排除扫描类的三种方式小结
    最近在做单测的时候,由于自己配置的spring boot容器会默认扫描很多不想被加载,网上中文的文章并不多,所以来总结一下。 默认下面描述的类都在一个包下面 第一步我们新建一个应用启...
    99+
    2024-04-02
  • MySQL删除表的三种方式(小结)
    drop table drop 是直接删除表信息,速度最快,但是无法找回数据 例如删除 user 表: drop table user; truncate (table) truncate 是删除表...
    99+
    2022-05-18
    MySQL 删除表
  • Spring中的事务控制知识总结
    目录一、环境准备二、基于 XML 的事务控制三、基于注解的事务控制一、环境准备 为了演示 Spring 中的事务控制,我们创建一个空项目,项目目录如下: 导入依赖: <d...
    99+
    2024-04-02
  • SpringBoot实现定时任务的三种方式小结
    目录定时任务实现的三种方式使用Timer使用ScheduledExecutorService使用Spring Task1.简单的定时任务2.多线程执行SpringBoot三种方式实现...
    99+
    2024-04-02
  • C#多态的三种实现方式(小结)
    C#实现多态主要有3种方法,虚方法,抽象类,接口 1 虚方法 在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上override关键字,例如下面的Perso...
    99+
    2024-04-02
  • Java中switch的三种用法方式小结
    目录标准方式switch - > 用法:switch yield 用法:返回值从java14开始, switch语句有了一个很大的调整, 这就让swicth语句有了更多的操作和...
    99+
    2023-05-16
    Java switch用法 switch yield
  • window.print()局部打印三种方式(小结)
    目录方法一: 通过开始、结束标记(startprint、endprint)来打印方法二:通过id选择器来替换内容打印,方法类似第一种方法三:通过动态创建iframe来打印(推荐的方法...
    99+
    2024-04-02
  • Spring的事务控制实现方法
    Spring的事务控制实现,供大家参考,具体内容如下 提示:这里使用的是xml的方式配置事务的 前言 例:当银行转账的时候,如果转账和收款的一方出现问题,那么这次的转账则不成功,此处...
    99+
    2024-04-02
  • Spring 加载 Application Context五种方式小结
    目录Spring创建出现的错误,ApplicationContext错误解决方案容器是Spring框架的核心。Spring 容器使用DI管理构成应用的组件。Spring容器使用DI管...
    99+
    2024-04-02
  • Spring事务&Spring整合MyBatis的两种方式
    目录Spring整合MyBatis整合方式一整合方式二Spring事务Spring整合MyBatis 在整合之前需要保证mybatis、springframework、mybatis...
    99+
    2023-02-15
    Spring整合MyBatis Spring事务
  • Python处理mat文件的三种方式小结
    目录处理mat文件的三种方式scipyh5pymat73mat4pypython操作.mat文件python读取.mat格式mat转图片处理mat文件的三种方式 读书的时候,处理数据...
    99+
    2024-04-02
  • Redis批量删除Key的三种方式小结
    目录一.使用命令行批量删除Redis的key二.使用图形界面工具RedisDesktopManager三.使用jedis批量删除keysRedis 中有删除单个 Key 的指令 del,但好像没有批量删除 Key 的指令...
    99+
    2023-04-10
    Redis批量删除Key Redis删除Key
  • log4j控制日志输出文件名称的两种方式小结
    目录log4j控制日志输出文件名称1. 第一种方式2. 第二种方式(这种方式亲测正确)如何随心所欲地自定义log4j输出格式log4j控制日志输出文件名称 1. 第一种方式 在类对象...
    99+
    2024-04-02
  • apache虚拟主机配置的三种方式(小结)
    目录一、基于IP二、基于主机名三、基于端口记事本打开httpd.conf文件 ,该文件在apache的目录下,如: D:\AppServ\Apache2.2\conf,修改如下两处: LoadModule vhost_a...
    99+
    2022-07-21
    apache虚拟主机配置 apache配置虚拟主机
  • feign实现传递参数的三种方式小结
    需要注意的一点是,feign好像是无法传递list集合类型的,但是你可以通过传递对象类型,然后在接收方再次将对象装在集合中达到集合传递的效果 传递方式一:传递的都是基本数据类型 re...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作