【事务】本地事务

137 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

事务学习大纲

踩了不少坑,我在这里列出事务相关的知识点,作为学习 list,指明一个大致的学习方向。后面几篇文章会以这里的大纲为主,提及相关的知识点。

这里先挖坑,后面挨着补。

  • 本地事务

    事务原则、实现原理

    数据库事务实现以及实例

    JDBC事务管理实例

  • Spring事务

    Spring事务机制、事物抽象

    内部事务、外部事物、几种事务管理实现

    Spring事务管理的实例(标签、代码方式)

    JPA、 JMS、 JTA事务管理的实例

  • 分布式系统

    分布式系统的定义、原则、实现

    分布式系统的几种形式

    Spring Cloud微服务系统以及实例

  • 分布式事务

    分布式事务定义、原则、实现原则

    Spring分布式事务管理实例:JTA、事务同步、链式

    消息驱动、事件溯源模式实现的详细实例

    分布式事务实现的几种模式:消息驱动、事件溯源、TCC。

  • DDD 中事务

    单独拿了出来,感觉这个挺有意思。

    如果状态需要完整一致地改变,将涉及这些状态的资源设计成一个聚合对象(聚合根),绑定在一起,通过原子性的长流程(如Saga)管理多个资源的状态完整性。

【问题】数据的一致性问题

我们在项目开发时会遇到的一些数据一致性问题。

  • 数据的并发访问、修改
  • 不同请求之间的数据隔离
  • 多个服务共同完成一个业务请求,保证都完成或失败
  • 发生异常时的数据回滚

【解决】单服务系统

  • 数据的并发访问、修改 - 事务
  • 不同请求之间的数据隔离 - 事务
  • 一个业务请求修改多个数据,保证都完成或失败 -事务
  • 发生异常时的数据回滚 - 事务

事务是什么

是以一种可靠、一致的方式,访问和操作数据库中数据的程序单元。

事务原则

  • A 原子性:操作只有成功或失败。
  • C 一致性:数据守恒,不凭空出现,也不凭空消失。由 AID 来保证。
  • I 隔离性:多个事务并行不能互相影响。
  • D 持久性:事务执行成功后宕机重启不影响,落盘。

事务的使用

SQL 中数据库事务

MySQL:

BEGIN TRANSACTION;
UPDATE t_user SET amount = amount-100 WHERE username = 'cxk';
UPDATE t_user SET amount = amount+100 WHERE username= 'lxl';
COMMIT
--ROLLBACK

Java 代码中使用事务

Connection conn = getConnection();
conn.setAutoCommit(false);
Statement stmt1 = conn.prepareStatement(updateUser1SQL);
stmtl.executeUpdate();
Statement stmt2 = conn.prepareStatement(updateUser2SQL);
stmt2.executeUpdate();
conn.commit(); // or conn.rollback ();