本文转载自微信公众号《程序员千语》,作者程序员千语。转载本文请联系程序员倩语公众号。GitHub:https://github.com/nateshao/ssm/tree/master/105-spring-transaction1。Spring事务管理概述什么是Spring事务管理?在实际开发中,操作数据库时会涉及到事务管理问题。为此,Spring提供了专门用于事务处理的API。Spring的事务管理简化了传统的事务管理流程,一定程度上减轻了开发人员的工作量。Spring事务管理的三个核心接口。在JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus。事务管理核心接口PlatformTransactionManagerPlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口提供了三种事务操作方法,如下:TransactionStatusgetTransaction(TransactionDefinitiondefinition):用于获取事务状态信息voidcommit(TransactionStatusstatus):用于提交事务voidrollback(TransactionStatusstatus):用于回滚事务PlatformTransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的。如何管理事务是由它的实现类完成的。该接口的几种常见实现类如下:提示:当底层采用不同的持久层技术时,系统只需要使用不同的PlatformTransactionManager实现类即可。TransactionDefinitionTransactionDefinition接口是交易定义(描述)对象,定义了交易规则,提供了获取交易相关信息的方法,如下:StringgetName();获取事务对象的名称intgetIsolationLevel();获取事务级别的隔离intgetPropagationBehavior();获取事务的传播行为intgetTimeout();获取事务的超时时间booleanisReadOnly();获取交易是否只读使用的交易。传播行为有很多种,如下表所示:在事务管理过程中,传播行为可以控制是否以及如何创建事务。通常情况下,数据查询不会影响原始数据的变化,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,则必须进行事务管理。如果没有指定事务传播行为,则需要Spring的默认传播行为。TransactionStatusTransactionStatus接口是交易的状态,描述了交易在某个时间点的状态信息。该接口包含6个方法,如下:voidflush();刷新交易布尔hasSavepoint();获取是否有保存点booleanisCompleted();获取交易是否完成booleanisNewTransaction();获取是否为新事务booleanisRollbackOnly();获取事务是否回滚voidsetRollbackOnly();设置事务回滚声明式事务管理的最大好处是开发者不需要通过编程来管理事务,只需要在配置文件中声明相关的事务规则即可。将事务应用于业务逻辑。这使得开发者可以更专注于编写核心业务逻辑代码,一定程度上减少了工作量,提高了开发效率。因此,在实际开发中,通常推荐声明式事务管理。2、声明式事务管理如何实现Spring的声明式事务管理?Spring的声明式事务管理可以通过两种方式实现,**一种是基于XML,另一种是基于Annotation。**在接下来的两节中,将详细解释这两种声明式事务管理方法。基于XML的声明式事务配置元素的重点是配置子元素。上图中灰色标记的属性是元素中的普通属性。其属性说明如下:Account.java@DatapublicclassAccount{privateIntegerid;//账户idprivateStringusername;//用户名privateDoublebalance;//账户余额}AccountDao.javapublicinterfaceAccountDao{.........//transferpublicvoidtransfer(StringoutUser,StringinUser,Doublemoney);}AccountDaoImpl.java@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false)@Overridepublicvoidtransfer(StringoutUser,StringinUser,Doublemoney){//收钱时,余额收款用户=现有余额+汇款金额this.jdbcTemplate.update("updateaccountsetbalance=balance+?"+"whereusername=?",money,inUser);//模拟系统运行时突发问题//inti=1/0;//汇款时,汇款用户余额=现有余额-汇款金额.junit.jupiter.api.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;/***@dateCreatedbyShaoTongjieon2021/10/1522:05*@微信公众号程序员千语*@个人网站www.nateshao.cn*@bloghttps://nateshao.gitee.io*@GitHubhttps://github.com/nateshao*@Giteehttps://gitee.com/nateshao*说明:*/publicclassTransactionTest{@TestpublicvoidxmlTest(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//获取AccountDao实例AccountDaoaccountDao=(AccountDao)applicationContext.getBean("accountDao");//调用accountDao实例中的transfer方法.transfer("Qianyu","Qianxun",100.0);//输出提示信息System.out.println("Transfersuccessful!");}}基于注解的声明式事务在Spring容器中注册事务注解驱动;在需要进行事务管理的类或方法上使用@Transactional注解如果给Bean类加上注解,则表示事务设置是针对整个Bean类的所有方法所有工作;如果注解被添加到Bean类中的某个方法,则意味着事务设置只对该方法有效。使用@Transactional注解时,可以通过参数配置事务详情:applicationContext-annotation.xmlTransactionTest.javapackagecom.nateshao.jdbc;importorg。junit.jupiter.api.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;/***@dateCreatedbyShaoTongjieon2021/10/1522:05*@微信公众号程序员千语*@个人网站www.nateshao.cn*@bloghttps://nateshao.gitee.io*@GitHubhttps://github.com/nateshao*@Giteehttps://gitee.com/nateshao*Description:*/publicclassTransactionTest{@TestpublicvoidannotationTest(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext-annotation.xml");//获取AccountDao实例AccountDaoaccountDao=(AccountDao)applicationContext.getBean("accountDao");//调用实例中的transfer方法accountDao.transfer("千寻111","千遇111",100.0);//输出提示信息System.out.println("Transfersuccessful!");}}小结本章主要详细讲解Spring中的事务管理。首先解释了Spring事务管理涉及的三个核心接口,然后介绍了Spring事务管理的两种方法,最后通过案例详细讲解了基于XML和基于Annotation的声明式事务处理的使用。通过本章的学习,相信大家能够对Spring的事务管理知识有一定的了解,能够掌握Spring的声明式事务管理的使用。