热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring中事务的使用与配置

原标题:Spring中事务的使用与配置文章目录Spring中事务的使用与配置

原标题:Spring中事务的使用与配置


文章目录



  • Spring中事务的使用与配置


    • 1.事务概念

    • 2.事务操作(模拟事务操作环境)

    • 3.事务管理(Spring事务管理)

    • 4.事务操作(注解声明式事务管理)

    • 5.事务操作(声明式事务管理参数配置)

    • 6.事务操作(XML 声明式事务管理)

    • 7.事务操作(完全注解声明式事务管理)





Spring中事务的使用与配置


1.事务概念



  1. 什么是事务?

    ①事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
    ②典型场景:银行转账 ,张三转账 100 元给李四, 张三少 100,李四多 100


  2. 事务的四个特性(ACID)

    原子性

    一致性

    隔离性

    持久性




2.事务操作(模拟事务操作环境)

在这里插入图片描述

①创建 service,搭建 dao,完成对象创建和注入关系

//(1)service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource
@Service
public class UserService {
//注入 dao
@Autowired
private Userwww.yii666.comDao userDao;
}
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
}

②在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)

@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
//lucy 转账 100 给 mary
//少钱
@Override
public void reduceMoney() {
String sql = "update t_account set mOney=money-? where username=?";
jdbcTemplate.update(sql,100,"lucy");
}
//多钱
@Override
public void addMoney() {
String sql = "update t_account set mOney=money+? where username=?";
jdbcTemplate.update(sql,100,"mary");
}
}
@Service
public class UserService {
//注入 dao
@Autowired
private UserDao userDao;
//转账的方法
public void accountMoney() {
//lucy 少 100
userDao.reduceMoney();
//mary 多 100
userDao.addMoney();
}
}
/**
上边代码正常执行没有问题,
但是如果代码执行过程中出现异常,有问题,如下模拟异常!
*/

@Service
public class UserService {
//这里执行后将会产生错误(异常),lucy 少 100后,mary不会多 100,这就不对了!!
private UserDao userDao;
//转账方法
public void accountMoney(){
userDao.reduceMoney();//lucy 少 100
int x=10/0;
userDao.addMoney(); //mary 多 100
}
}
//解决上边的异常方法——【编程式事务(传统方法)】
//转账的方法
public void accountMoney() {
try {
//第一步 开启事务
//第www.yii666.com二步 进行业务操作
//lucy少100
userDao.reduceMoney();
文章来源地址51387.html //模拟异常
int i = 10/0;
//mary多100
userDao.addMoney();
//第三步 没有发生异常,提交事务
}catch(Exception e) {
//第四步 出现异常,事务回滚
}
}


3.事务管理(Spring事务管理)



  1. 事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)


  2. 在 Spring 进行事务管理操作 ;两种方式:

    ①编程式事务管理、

    声明式事务管理(推荐使用)


  3. 声明式事务管理 :

    基于注解方式(推荐使用)

    ②基于 xml 配置文件方式


  4. 在 Spring 进行声明式事务管理,底层使用 AOP 原理


  5. Spring 事务管理 API :提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类




4.事务操作(注解声明式事务管理)



  1. 在 spring 配置文件,配置事务管理器


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


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


  2. 在 spring 配置文件,开启事务注解


    <tx:annotation-driven transactionmanager="transactionManager">tx:annotation-driven>


  3. 在 service 类上面(或者 service 类里面方法上面)添加事务注解

    @Transactional,这个注解添加到类上面,也可以添加方法上面

    ②如果把这个注解添加类上面,这个类里面所有的方法都添加事务

    ③如果把这个注解添加方法上面,为这个方法添加事务

    @Service
    @Transactional
    public class UserService {
    @Autowired
    private UserDao userDao;
    public void accountMony() {
    userDao.reduceMoney();
    int i = 10 / 0;
    userDao.addMoney();
    }
    }




5.事务操作(声明式事务管理参数配置)


  1. propagation(事务传播行为):多事务方法直接进行调用,这个过程中事务是如何进行管理的。

    在这里插入图片描述

    spring框架事务传播行为有七种:下面只介绍常用的两种传播行为

    REQUIRED:如果add方法本身有事务,调用update方法后,update使用当前add方法里面的事务。 如果add方法本身没有事务,调用update方法后,创建新的事务。文章来源站点https://www.yii666.com/

    REQUIRED_NEW:使用add调用update方法,不论add方法是否有事务,都会创建新的事务。

    @Transactional(propagation = Propagation.REQUIRED,) //事务一
    public void add(){
    //调用update方法
    update();
    }
    public void update(){ //事务二
    }

    Spring定义的7种类传文章来源地址51387.html播行为:

a\Roaming\Typora\typora-user-images\image-20210831150628695.png)]


  1. ioslation(事务隔离级别)

    事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题 。有三个读问题:脏读、不可重复读、虚(幻)读 。

    脏读:一个未提交事务读取到另一个未提交事务的数据。

    不可重复读:一个未提交事务读取到另一提交事务修改数据。

    虚读:一个未提交事务读取到另一提交事务添加数据。

    解决办法:通过设置事务隔离级别,解决读问题


































    脏读不可重复读幻读
    READ UNCOMMITTED(读未提交)
    READ COMMITTED(读已提交)
    REPEATABLE READ(可重复读)
    SERIALIZABLE(串行化)

    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)


  2. timeout(超时时间)

    ①事务需要在一定时间内进行提交,如果不提交进行回滚 。

    ②默认值是 -1(不超时) ,设置时间以秒单位进行计算。


  3. readOnly(是否只读)

    ①读:查询操作,写:添加修改删除操作。

    ②readOnly 默认值 false,表示可以查询,可以添加修改删除操作。

    ③设置 readOnly 值是 true,设置成 true 之后,只能查询。


  4. rollbackFor(回滚)

    设置出现哪些异常进行事务回滚


  5. noRollbackFor(不回滚)

    设置出现哪些异常不进行事务回滚




6.事务操作(XML 声明式事务管理)


  1. 在 spring 配置文件中进行配置 :

    ①配置事务管理器

    ②配置通知

    ③配置切入点和切面


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

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

    <tx:advice id="txadvice">

    <tx:attributes>

    <tx:method name="accountMoney" propagation="REQUIRED"/>

    tx:attributes>
    tx:advice>

    <aop:config>

    <aop:pointcut id="pt" expression="execution(*
    com.atguigu.spring5.service.UserService.*(..))"
    />


    <aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
    aop:config>



7.事务操作(完全注解声明式事务管理)

创建配置类,使用配置类替代 xml 配置文件

//1、创建配置类,使用配置类替代 xml 配置文件
@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///test");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建 JdbcTemplate 对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {//从IOC容器中拿到配置注入的数据源
//到 ioc 容器中根据类型找到 dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入 dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager
getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}

@Test
public void test1() {
ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.accountMony();
}

最后喜欢的小伙伴别忘了一键三连哦???
在这里插入图片描述

来源于:Spring中事务的使用与配置


推荐阅读
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
author-avatar
小玲的夏天_905_735_602
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有