Young's blog Young's blog
首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Young

首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 手把手教你玩转 SpringBoot 日志比较
  • Springboot [日志管理LogBack]
  • 【Spring】事务失效的场景
  • excel百万数据如何导入导出
  • 如何介绍自己的项目经验?
  • 多线程事务回滚的处理
  • idea 热部署插件 JRebel 安装及破解,不生效问题解决
  • SpringBoot 监控神器——Actuator 保姆级教程
  • 什么是多租户架构?
  • 小心 MybatisPlus 的一个坑与面试题 Transaction rolled back because it has been marked as rollback-only
  • SpringBoot 插件化开发模式详细总结
  • CAS 单点登录概念
  • SpringBoot读配置的6种方式
  • 阿里二面:使用 Nacos 做注册中心怎么做优雅发布?
  • 分布式系统的补偿机制!
  • 复杂业务系统的架构思路!
  • 解读 RocketMQ 5.0 全新的高可用设计
  • Spring事务详解
    • 示例
  • 一文总结 MetaQ/RocketMQ 原理
  • Spring boot
andanyang
2023-08-10
目录

Spring事务详解

Spring 事务王国概览 (opens new window)

Spring 事务管理—上 (opens new window)

Spring 事务管理—中 (opens new window)

Spring 事务管理—下 (opens new window)

Spring 事务扩展篇 (opens new window)

# 事务创建涉及到一些属性的配置,如:

  • 事务的隔离级别
  • 事务的传播行为
  • 事务的超时时间
  • 是否为只读事务

# 事务家族

事务的大家族中常会出现下面几个重要的家庭成员:

  • Resource Manager: 简称 RM,可以将其看做是数据的管理员,例如,数据库服务器(mysql),消息服务器等
  • Transaction Processing Monitor: 简称 TPM 或者 TP Monitor,他负责在分布式场景下协调多个 RM 的事务处理。
  • Transaction Manager: 简称 TM,它可以认为是 TP Monitor 的核心模块,直接负责多 RM 之间事务处理的协调工作,并提供事务界定,事务上下文传播等功能接口。

# 三大主要类

  • PlatformTransactionManager: 负责界定事务边界

    public interface PlatformTransactionManager extends TransactionManager {
    	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
    			throws TransactionException;
    	void commit(TransactionStatus status) throws TransactionException;
    	void rollback(TransactionStatus status) throws TransactionException;
    }
    
    1
    2
    3
    4
    5
    6
  • TransactionStatus : 记录整个事务处理过程中的事务状态

    • SavepointManager:

      • mysql 中 savepoint 的用法吧:

        ET autocommit=0;
        START TRANSACTION;
        DELETE FROM test1 WHERE  NAME='大忽悠';
        SAVEPOINT a;#设置保存点
        DELETE FROM test1 WHERE  NAME='小朋友';
        ROLLBACK TO a;#回滚到保存点
        
        1
        2
        3
        4
        5
        6

        SAVEPOINT的好处在于可以选择回滚一部分事务

  • TransactionDefinition :主要定义了事务属性相关配置:

    • 事务的隔离级别
    • 事务的传播行为
    • 事务的超时时间
    • 是否为只读事务
    # TransactionTemplate:

    是 Spring 提供的进行编程式事务管理的模板方法类,他直接继承了 DefaultTransactionDefinition。

    TransactionTemplate 的设计思想和 JDBCTemplate 一致,是通过模板方法加回调接口的方式,将通用的事务处理代码,和资源管理封装为模板方法,而将需要变化的,并且需要被事务包裹的代码,以回调接口的形式传递出去。

# 示例

public class TransactionMain {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        test();
    }

    private static void test() {
        DataSource dataSource = getDS();
        JdbcTransactionManager jtm = new JdbcTransactionManager(dataSource);
        //JdbcTransactionManager根据TransactionDefinition信息来进行一些连接属性的设置
        //包括隔离级别和传播行为等
        DefaultTransactionDefinition transactionDef = new DefaultTransactionDefinition();
        //开启一个新事务---此时autocommit已经被设置为了false,并且当前没有事务,这里创建的是一个新事务
        TransactionStatus ts = jtm.getTransaction(transactionDef);
        //进行业务逻辑操作
        try {
            update(dataSource);
            jtm.commit(ts);
        }catch (Exception e){
            jtm.rollback(ts);
            System.out.println("发生异常,我已回滚");
        }
    }

    private static void update(DataSource dataSource) throws Exception {
        JdbcTemplate jt = new JdbcTemplate();
        jt.setDataSource(dataSource);
        jt.update("UPDATE Department SET Dname=\"大忽悠\" WHERE id=6");
        throw new Exception("我是来捣乱的");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
上次更新: 2024/04/19, 08:52:45
解读 RocketMQ 5.0 全新的高可用设计
一文总结 MetaQ/RocketMQ 原理

← 解读 RocketMQ 5.0 全新的高可用设计 一文总结 MetaQ/RocketMQ 原理→

最近更新
01
idea 热部署插件 JRebel 安装及破解,不生效问题解决
04-10
02
spark中代码的执行位置(Driver or Executer)
12-12
03
大数据技术之 SparkStreaming
12-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Young | MIT License
浙ICP备20002744号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式