百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

掌握数据库事务与spring事务传播行为

xsobi 2024-12-14 15:45 1 浏览


前言:

事务管理是确保数据安全和一致性的关键组成部分,特别是在进行数据库操作时。SpringBoot事务与数据库事务是密切相关的,具体来说,SpringBoot事务是对数据库事务的封装和管理。下面分别数据库事务,springboot事务进行详细阐述。

一、数据库事务:

在数据库操作中,事务(Transaction)是一个逻辑单元,由一组操作组成,这些操作要么全部成功,要么全部失败,以保证数据的一致性和完整性。事务具有以下几个关键特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间状态。
  • 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
  • 隔离性(Isolation):并发事务之间互不影响,每个事务都看作数据库的唯一操作。
  • 持久性(Durability):一旦事务提交,其结果是永久性的,即使系统崩溃也不会丢失。

1.事务管理:包括事务的开启、执行、提交和回滚等操作。

2.隔离级别:事务隔离级别是指多个事务之间的隔离程度。常见的事务隔离级别有:

  • 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读。简单理解:事务a新增一条数据,没有提交,事务b读取到了这条数据。
  • 读已提交(Read Committed):只读取已提交的数据,防止脏读,但可能出现不可重复读。简单理解:事务b在读取数据时,事务a修改了这些数据并提交,可能会导致“不可重复读”。即同一b 事务内多次读取同一数据可能得到不同结果。
  • 可重复读(Repeatable Read):确保在一个事务内多次读取数据时数据一致,防止不可重复读,但可能出现幻读(在某些数据库系统中,如MySQL的InnoDB引擎,通过间隙锁可以避免幻读)。
  • 串行化(Serializable):最高的隔离级别,完全隔离,防止脏读、不可重复读和幻读。但会严重影响并发性能。

3.事务日志:在数据库事务管理中,日志是维护数据一致性和完整性的重要手段。常见的日志包括:

  • undo日志(回滚日志):用于撤销未提交的事务对数据库的影响。当事务失败或回滚时,Undo日志会记录需要撤销的操作,以便将数据库恢复到事务开始前的状态。
  • redo日志(重做日志):用于记录已提交事务的操作。当系统崩溃或发生故障时,Redo日志可以用于恢复已提交的事务,确保数据的持久性。

二:SpringBoot事务

SpringBoot事务是对数据库事务的封装和管理,SpringBoot事务是Spring框架提供的一种声明式事务管理方式,它允许开发者通过简单的注解或配置来管理事务,而无需在代码中显式地控制事务的开始、提交和回滚。这种方式极大地简化了事务管理的复杂性,提高了开发效率。

  • 封装与管理:SpringBoot事务本质上是对数据库事务的封装和管理。它使用数据库连接,并根据Spring的事务配置来操作这个连接,从而实现对数据库事务的开启、提交和回滚等操作。
  • 事务管理器:SpringBoot通过事务管理器(如DataSourceTransactionManager、JpaTransactionManager等)来管理数据库事务。这些事务管理器是Spring框架提供的,用于处理不同数据源和技术的事务。
  • 声明式事务管理:SpringBoot支持声明式事务管理,通过@Transactional注解来指定事务的传播行为、隔离级别、回滚规则等。这种方式使得事务管理更加简洁和方便,开发者只需关注业务逻辑,而无需关心事务的具体实现。
  • 事务的传播特性与隔离级别:SpringBoot事务继承了数据库事务的传播特性和隔离级别。传播特性定义了多个事务方法相互调用时,一个事务方法应该如何加入或创建事务。隔离级别则定义了多个事务并发执行时的相互影响程度。SpringBoot允许开发者通过配置来指定这些属性,以满足不同的业务需求。

传播行为:定义了事务的边界和行为。当一个事务方法被另一个事务方法调用(或者说一个事务方法里面调用了另外一个事务方法)时事务如何被传播。

  • REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新事务。
  • REQUIRES_NEW:总是创建一个新事务,如果当前存在事务,则将当前事务挂起。
  • SUPPORTS:如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。
  • NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则将当前事务挂起。
  • MANDATORY:如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。
  • NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:如果当前存在事务,则在当前事务中嵌套一个事务(仅支持JDBC事务管理器)。

1. 声明式事务管理

声明式事务管理是通过注解或XML配置来实现的,这是Spring Boot推荐的事务实现方式。最常用的注解是@Transactional。

注意:@Transactional可以加在类上,也可以加在方法上。加在类上,就等同于类内部的所有方法,都加入了@Transactionaly注解。一般情况下是加在方法上。这里注意一点,在同一个类中,2个方法互相调用,是无法触发事务的。比如说,A类里有方法1和方法2,他们都加入了@Transactional注解,方法1里面直接调用方法2,这样是无法使事务生效的,因为Spring中事务管理是使用AOP代理技术实现的,目标对象自身并没有事务管理功能的,而是通过代理对象动态增强功能对事务进行增强的。因此当我们在同一个类中通过一个方法调用另一个方法时,是通过目标对象this对象调用的,目标对象自身并没有事务管理功能,因此事务不能生效。

代码示例

首先需要在启动类加入@EnableTransactionManagement注解开启事务

Bash
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
public class UserService {
 
    @Autowired
    private UserMapper userMapper;
 
    @Transactional
    public void updateUser(User user) {
         userMapper.update(user);
    }
}

2. 编程式事务管理

编程式事务管理通常使用TransactionTemplate或PlatformTransactionManager进行控制。

代码示例

Bash
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
 
import javax.sql.DataSource;
 
@Configuration
public class TransactionConfig {
 
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

3. 配置事务管理器

在Spring Boot中,我们需要配置事务管理器来管理事务。最常见的事务管理器是DataSourceTransactionManager(适用于JDBC操作)和JpaTransactionManager(适用于JPA操作)。管理dataSource的事务。

代码示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
 
import javax.sql.DataSource;
 
@Configuration
public class TransactionConfig {
 
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

总结;

事务管理是确保数据安全和一致性的关键组成部分。Spring Boot提供了强大的事务管理功能,支持声明式事务管理和编程式事务管理两种方式。通过合理配置事务的传播行为、隔离级别、超时时间和回滚规则等属性,我们可以确保Spring Boot应用程序中的事务处理既安全又高效。希望本文能够帮助你更好地理解Spring Boot中的事务管理,并通过代码示例掌握其应用。

相关推荐

图解面试题:SQL存储过程有什么用?

面试中有时候会问:存储过程有什么用?看了今天的知识,你就知道如何回答了。1.存储过程是什么?假如你每天要开车完成一些列重复的操作:车钥匙启动车,倒车。现在出现了一款新车,可以自动的完成这些重复的工作。...

零基础入门开始学习SQL Server存储过程

你好啊,我是晨希,今天我们来了解一下SQLServer的存储过程,通过这篇零基础的SQLServer存储过程入门指南文章。您将了解到什么是存储过程,如何创建、调用和优化它们,以及如何提高安全性和性...

SQLSERVER:存储过程和函数

在SQLServer中,存储过程和函数是数据库编程的基础。它们允许开发者编写SQL脚本来执行复杂的操作,同时提供了代码重用和逻辑封装的能力。下面将通过一些实例来详细介绍存储过程和函数的使用。...

数据库基础知识:SQL Server存储过程入门必知

什么是存储过程SQL语句需要先编译然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储...

SQL储存过程

存储过程是一组预编译的SQL语句,可以保存在数据库中,并作为一个单元执行。它封装了复杂的操作逻辑,可以包含控制结构(如条件判断、循环)、输入参数、输出参数以及错误处理逻辑。存储过程的主要目的是提...

sqlserver开窗及去重row_number() over(partition by c1 order by c2)

开窗函数/分析函数:over()开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数。...

SQL server中exists用法

1、简介?不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询?相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询。带Exists的子查询就是相关子查询...

SQL 将两张包含相同字段和不同字段的表数据合并成一张表

第一种:两个表的相同字段数据查询后合并起来select工号,卡号,姓名,时间from(selectPeople_id工号,People_id卡号,People_name姓名,Rep...

「Oracle」 sql语句查询报错ORA-00904

Oracle报错ORA-00904:标识符无效一般情况下,标识符错误是因为:语句中的列名在表中不存在,修改sql语句或者修改列名即可。...

SQL轻松入门(5):窗口函数

01前言标题中有2个字让我在初次接触窗口函数时,真真切切明白了何谓”高级”?说来也是一番辛酸史!话说,我见识了窗口函数的强大后,便磨拳擦掌的要试验一番,结果在查询中输入语句,返回的结果却是报错,Wh...

SQLServer 日期函数大全

一、统计语句1、--统计当前【>当天00点以后的数据】SELECT*FROM表WHERECONVERT(Nvarchar,dateandtime,111)=CONVERT(Nv...

一文讲懂SQL联合查询UNION

大家好,我是宁一。今天讲解SQL教程第13课:UNION联合查询。...

SQL中的INSERT INTO SELECT语句:数据复制的高效利器

SQL是数据库操作的重要语言,INSERTINTOSELECT语句则是其中的一把利器。本文将详细介绍这一语句的用法和优势,帮助读者更好地理解和运用。一、引言...

SQL server查询-日期操作

常用的sql语句查询:...

sql查询更新update select

针对一个上线的项目进行数据库优化,以便后期统计,遇到一个数据填充的问题,在此记录一下,各位如果也有这种问题,欢迎一起交流。表结构:...