数据安全之舞: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);
    }
}
正常提交

异常回滚



相关文章
|
1月前
|
存储 安全 分布式数据库
探索区块链技术在数据安全中的应用
【10月更文挑战第21天】 本文深入探讨了区块链技术在增强数据安全性方面的应用。通过对区块链基本原理的解释,结合其在数据存储、传输和访问控制中的具体实现方式,本文揭示了区块链技术如何有效防止数据篡改和未授权访问。此外,文章还讨论了区块链技术面临的挑战及其未来发展趋势,为读者提供了一个全面了解区块链技术在数据安全领域应用的视角。
54 4
|
4月前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
122 6
|
28天前
|
供应链 安全 区块链
探索区块链技术在数据安全中的应用
本文深入探讨了区块链技术如何革新数据安全领域,特别是在保护个人隐私、增强数据完整性和透明度方面的作用。通过分析区块链的去中心化特性、加密技术以及智能合约的功能,文章阐述了这一技术如何有效防止数据篡改、确保交易记录的不可逆性,并促进跨组织间的信任建立。此外,还讨论了当前区块链技术面临的挑战及未来发展趋势,为理解其在数据安全领域的潜力提供了全面视角。
|
1月前
|
存储 监控 区块链
探索区块链技术在数据安全中的应用
本文深入探讨了区块链技术如何革新数据安全领域,通过其独特的去中心化、不可篡改和透明性特点,为数据安全提供了新的解决方案。我们将从区块链的基本原理出发,分析其在保护数据完整性、增强隐私保护以及提升交易安全性方面的应用,并通过案例研究展示区块链技术在实际场景中的有效性。
|
1月前
|
数据安全/隐私保护 数据格式
数据安全必备:三种实用的数据脱敏技术
在数字化时代,数据安全和隐私保护成为了企业和个人关注的焦点。数据脱敏作为一种有效的数据保护手段,能够降低数据泄露的风险,保护用户隐私。本文将介绍三种常见的数据脱敏方案,帮助您在实际工作中选择合适的脱敏技术。
148 2
|
1月前
|
存储 供应链 安全
深入探讨区块链技术在数据安全中的应用
本文旨在探讨区块链技术在数据安全领域的应用,分析其如何通过去中心化的特性增强数据的安全性和透明度。文章首先介绍区块链的基本原理,然后详细阐述其在防止数据篡改、提高交易安全性以及实现数据共享方面的优势。最后,文章讨论了当前区块链技术面临的挑战和未来的发展趋势。
|
2月前
|
存储 Java API
简单两步,Spring Boot 写死的定时任务也能动态设置:技术干货分享
【10月更文挑战第4天】在Spring Boot开发中,定时任务通常通过@Scheduled注解来实现,这种方式简单直接,但存在一个显著的限制:任务的执行时间或频率在编译时就已经确定,无法在运行时动态调整。然而,在实际工作中,我们往往需要根据业务需求或外部条件的变化来动态调整定时任务的执行计划。本文将分享一个简单两步的解决方案,让你的Spring Boot应用中的定时任务也能动态设置,从而满足更灵活的业务需求。
183 4
|
2月前
|
存储 供应链 安全
使用区块链技术增强数据安全性
使用区块链技术增强数据安全性
|
3月前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
50 1
|
3月前
|
存储 安全 区块链
探索区块链技术在数据安全中的应用
本文旨在通过浅显易懂的语言,向读者介绍区块链这一看似复杂实则贴近我们生活的技术。我们将从基础概念出发,逐步深入到区块链技术如何在保护个人隐私和确保数据安全方面发挥巨大作用。文章将用简单的例子和直观的比喻,帮助读者理解区块链的工作原理及其在现实世界的应用价值。
69 6