数据安全之舞:Spring事务处理的实用指南与技术要点

简介: 数据安全之舞:Spring事务处理的实用指南与技术要点


什么是事务

事务(Transaction)是指作为一个逻辑工作单元执行的一系列操作,这些操作要么全部成功完成,要么全部失败回滚。事务是数据库管理系统中保证数据一致性和完整性的重要机制。

事务具有以下四个特性,通常被称为 ACID 特性:

  1. 原子性(Atomicity):事务是一个原子操作单位,不可分割。它要么全部执行成功,要么全部撤销,没有中间状态。如果事务的所有操作都成功执行,就会被提交;如果有任何一个操作失败,就会被回滚到事务开始前的状态。
  2. 一致性(Consistency):在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。事务执行过程中的中间状态不会被其他事务所见,只有在事务提交后才会对其他事务可见。
  3. 隔离性(Isolation):多个事务并发执行时,每个事务的执行都应该像是在独立的环境中执行,互相之间不会干扰。每个事务都应该感知不到其他事务的存在,避免出现读取未提交数据、脏读、不可重复读和幻读等并发问题。
  4. 持久性(Durability):一旦事务被提交,对数据库的修改将会永久保存,即使系统发生故障也不会丢失。持久性确保了数据的可靠性和持久可追溯性。

如何控制事务

JDBC:
  Connection.setAutoCommit(false);
  Connection.commit();
  Connection.rollback();
  
MyBatis:
  SqlSession.commit();
  SqlSession.rollback();

控制事务的底层都是通过连接对象(Connection)来控制事务的,Mybatis 的 SqlSession 底层也是对 Connection 的封装。

开发 Demo

引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>

原始对象

world.xuewei.service.AccountService

package world.xuewei.service;
import world.xuewei.entity.Account;
/**
 * 账户服务
 *
 * @author 薛伟
 * @since 2023/10/23 16:23
 */
public interface AccountService {
    /**
     * 账户注册
     */
    void register(Account account);
}

world.xuewei.service.AccountServiceImpl

package world.xuewei.service;
import org.springframework.transaction.annotation.Transactional;
import world.xuewei.dao.AccountDao;
import world.xuewei.entity.Account;
/**
 * 账户服务实现类
 *
 * @author 薛伟
 * @since 2023/10/23 16:24
 */
@Transactional
public class AccountServiceImpl implements AccountService {
    private AccountDao accountDao;
    /**
     * 账户注册
     */
    @Override
    public void register(Account account) {
        // 注册逻辑编写
        accountDao.insert(account);
    }
    public AccountDao getAccountDao() {
        return accountDao;
    }
    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }
}

@Transactional 注解可以加在指定方法或者类上。

Spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 配置连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://**.**.*.*/learn?useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="*****"/>
    </bean>
    <!-- 配置 SqlSessionFactoryBean -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定所有实体所在的包 -->
        <property name="typeAliasesPackage" value="world.xuewei.entity"/>
        <property name="mapperLocations">
            <list>
                <!-- 将所有的 Mapper 的配置文件放在 resources/mappers 目录下 -->
                <value>classpath:mappers/*Mapper.xml</value>
            </list>
        </property>
    </bean>
    <!-- 配置 MapperScannerConfigurer -->
    <bean id="scanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <!-- 指定所有 dao 所在的包 -->
        <property name="basePackage" value="world.xuewei.dao"/>
    </bean>
    <!-- 注册账户服务 -->
    <bean id="accountService" class="world.xuewei.service.AccountServiceImpl">
        <!-- 注入账户 Dao,Dao 的 Bean 名字为对应 Dao 类名的首单词首字母小写-->
        <property name="accountDao" ref="accountDao"/>
    </bean>
    <!-- 配置事务管理器 -->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 组装切面 -->
    <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
</beans>

整个 Spring 事务控制的底层就是使用了 AOP。tx:annotation-driven 可以通过配置 proxy-target-class="true" 强制底层在创建代理的时候使用 Cglib 方式

测试程序

package world.xuewei;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import world.xuewei.entity.Account;
import world.xuewei.service.AccountService;
/**
 * @author 薛伟
 * @since 2023/9/14 20:51
 */
public class DaoTest {
    private ClassPathXmlApplicationContext context;
    @Before
    public void before() {
        // 指定配置文件,创建 Spring 工厂
        context = new ClassPathXmlApplicationContext("/applicationContext.xml");
    }
    /**
     * 测试事务
     */
    @Test
    public void test2() {
        AccountService service = context.getBean("accountService", AccountService.class);
        Account account = new Account(2, "张三", "123456");
        service.register(account);
    }
}
正常提交

异常回滚



相关文章
|
3月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
437 0
|
4月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
418 0
|
6月前
|
存储 供应链 API
区块链技术在电商API中的应用:保障数据安全与交易透明
区块链技术在电商API中的应用,为数据安全与交易透明提供了新方案。通过数据加密、分布式存储、智能合约管理、商品溯源及实时结算等功能,有效提升电商数据安全性与交易可信度。然而,技术成熟度、隐私保护和监管合规等挑战仍需克服。未来,随着物联网、大数据等技术融合及政策支持,区块链将在电商领域发挥更大潜力,推动行业智能化发展。
|
3月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
247 1
|
3月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
482 1
|
3月前
|
Java 数据库连接 开发者
Spring Framework 核心技术详解
本文档旨在深入解析 Java Spring Framework 的核心技术原理与应用。与侧重于快速开发的 Spring Boot 不同,本文将聚焦于 Spring 框架本身的设计理念、核心容器、控制反转(IoC)、面向切面编程(AOP)、数据访问与事务管理等基础且强大的模块。通过理解这些核心概念,开发者能够更深刻地领悟 Spring 生态系统的设计哲学,并具备解决复杂企业级应用开发问题的能力。
282 4
|
4月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
393 2
|
3月前
|
监控 Java API
Spring WebFlux 响应式编程技术详解与实践指南
本文档全面介绍 Spring WebFlux 响应式编程框架的核心概念、架构设计和实际应用。作为 Spring 5 引入的革命性特性,WebFlux 提供了完全的响应式、非阻塞的 Web 开发栈,能够显著提升系统的并发处理能力和资源利用率。本文将深入探讨 Reactor 编程模型、响应式流规范、WebFlux 核心组件以及在实际项目中的最佳实践,帮助开发者构建高性能的响应式应用系统。
770 0
|
3月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
403 0
|
3月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
480 0

热门文章

最新文章