0


Spring-----事务管理

1. Spring中事务的管理

*1.1 为什么要使用spring事务*

可以保证数据的完整性。

例子: 转账为例。

张三向李四转账1000元。----再数据库中修改两个账号的余额。

发生意外情况,则出现金庸减钱成功,而张无忌加钱失败。

如何解决?

使用事务解决问题

此时代码执行后金庸的钱没有减,张无忌的钱也没有加,问题完美解决! nice


疑惑: 明明第一条语句已经执行成功,为什么没有减钱呢

**数据库事务的原理 **

如果不写begin;commit;此时事务默认自动开启,自动提交; 在数据库中 ,事务都是自动提交的。事务的自动提交就是 执行sql语句完成之后 就立 刻持久化到 数据库中。

begin;开始事务

rollback;回滚事务

commit;提交事务

当我们添加了begin;和commit;后 事务的提交就从自动变成手动。因为中 途出错,所以导致 commit;不执行,也就是说缓冲区中的数据没有持久化 的数据库中 。 我在mysql数据库中给大家演示。能不能通过代码演示

package com.wzh;  
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
/** 
 * @program: transaction-qy151 
 * @description: 
 * @create: 2022-07-07 14:38 
 * 默认jdbc 事务也是自动提交
 **/ 
 public class Test {
     public static void main(String[] args) { 
         Connection connection =null; 
         try {
               Class.forName("com.mysql.cj.jdbc.Driver"); 
               connection= DriverManager.getConnection(                                     
                    "jdbc:mysql://localhost:3306/mydb? serverTimezone=Asia/Shanghai", 
                    "root", 
                    "root" );
               connection.setAutoCommit(false);//开启事务的 手动提交 
               String sql = "update tb_emp set salary=salary-1000 where name='金庸'";             
               PreparedStatement ps = connection.prepareStatement(sql); 
               ps.executeUpdate(); 

    
               String sql1 = "update tb_emp set salary=salary+1000 where name='张无忌'"; 
               ps = connection.prepareStatement(sql1); 
               ps.executeUpdate(); 
               connection.commit();//提交事务 
          }catch (Exception e){ 
                try {
                     connection.rollback();//事务回滚 最初的状 态 
                } catch (SQLException throwables) {
                     throwables.printStackTrace(); 
                }e.printStackTrace(); 
          }finally{ 
            
          }
    }
 
}

**1.2 什么是事务? **

从开启到提交为一个事务。 由此可见,一个事务对应一组业务。一个事务 中间可以有一条sql,多条sql。 所以 一个业务开始之前 开启事务 一个业务 结束之后 提交事务。 我们这个转账案例:需要几个事务? 可以写成两个事务,但是不合适。因为我们的需求 让张三减的同时让李四加钱。只能写 成一个事务。 把多条sql语句当作一件事情,要同时都能执行到。

事务(Transaction),一般是指要做的或所做的事情。在计算机术语 中是指访问并可能更新数据库中各种数据项的一个程序执行单元 (unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或 Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始 (begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

概括为: 事务是由一些列动作组成,这些动作要么都执行,要么都不执行。

1.3 事务的特性:ACID

*1、原子性(Atomicity***): **

事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中 出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分 割的整体,就像化学中学过的原子,是物质构成的基本单位。

*2、一致性(Consistency***): **

事务开始前和结束后,数据库的数据完整性约束没有被破坏,事务前后操作数据是一致的 。比如 A向B转账,不可能A扣了钱,B却没收到。

能量守恒

*3、隔离性(Isolation***): **

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是 隔离的,并发执行的各个事务之间不能互相干扰。比如A正在从一张银行卡中取钱,在A取钱的过 程结束前,B不能向这张卡转账。 两个事务之间是有隔离级别,隔离级别的不同会导致出现不同的问题。此时产生三种读: 脏读 幻读 不可重复读。

*4、持久性(Durability***): **

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库 中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

**1.4 **事务的并发问题

不可重复读操作的是同一条数据,而且做的是修改操作

1.5.隔离级别

解决上面事务并发带来的问题
隔离级别脏读不可重复读****幻读READ-UNCOMMITTED√√√READ-COMMITTED×√√REPEATABLE-READ××√SERIALIZABLE×××

** 级别越高,效率越低;mysql的默认隔离级别是可重复读**

mysql如何查看隔离级别以及设置隔离级别:

2.Spring如何支持事务

思考:业务功能包含多个操作,[我们可以使用事务来管理]

spring如何支持事务的呢?---思考:事务管理加在那一层?service层

** 1.加入aspect,tx依赖**

    <!--aop 面向切面编程 切面依赖-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>5.2.15.RELEASE</version>
      </dependency>
      <!--spring的事务依赖-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>5.2.15.RELEASE</version>
      </dependency>

2.spring配置事务管理类开启事务注解

    <!--创建spring事务管理类-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="DataSource"/>
    </bean>

    <!--开启事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

3. 在相应的类或方法上添加事务注解@Transactional

标签: spring

本文转载自: https://blog.csdn.net/weixin_68509156/article/details/125667040
版权归原作者 挂在树上的猴子 所有, 如有侵权,请联系我们删除。

“Spring-----事务管理”的评论:

还没有评论