本文已参与「新人创作礼」活动,一起开启掘金创作之路。
事务学习大纲
踩了不少坑,我在这里列出事务相关的知识点,作为学习 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 ();