Java总结 - 知识大纲

文章目录

  • 网络&系统&项目
  • 基础知识
  • 数据结构与算法
  • 线程与并发
  • JVM&GC&类加载
  • Spring&SpringBoot
  • 设计模式实践
  • Mybatis
  • MySQL
  • 分布式
  • Redis
  • Netty
  • Nginx
  • Feign
  • Nacos
  • Hystrix
  • xxl-job
  • 消息中间件
  • Dubbo
  • Zookeeper
  • SpringCloud

网络&系统&项目

Linux常用命令
TCP三次握手&四次挥手
TCP和UDP区别
TCP可靠性机制(数据分片/收到确认/超时重发/滑动窗口/乱序重排/数据校验)
滑动窗口(提高效率/流量控制)
TCP、IP通俗理解(传输层&网络层)(物理链路网络传输会表应)
select、poll和epoll区别
BIO、NIO、AIO(主动查询&异步)
NIO中三大组件及其作用
零拷贝是什么
(read/write 4次用户态内核态切换 4次拷贝)
(mmap/write 4次用户态内核态切换 3次拷贝)
(sendfile 2次用户态内核态切换 3|2次拷贝)

成就感、挑战性、亮点项目
项目及负责的模块
线上问题处理方式
Maven中Package与Install
HTTPS如何保证安全传输(请求证书/交互秘钥/加密数据)
浏览器发出请求到收到响应经历哪些过程
跨域请求是什么 如何解决
延时任务调度器、DelayQueue、RocketMQ、ScheduledThreadPoolExecutor实现延时任务优劣(系统重启任务丢失 大量任务占内存)
延时任务调度器(RocketMQ5.0延时消息)
分布式高并发设计方案(整体结构 单体结构 接口层面)
(整体结构 DNS/四层负载均衡/七层负载均衡)
(单体结构 服务拆分/动静分离/数据应用分离/读写分离/分库分表/缓存)
(接口层面 sql/异步/线程池)
好代码个人体会(可读性 可维护性 简洁 规范)
单点登录解决方案

基础知识

对Java的理解
面向对象与三特性
重载与重写
JDK JRE JVM
接口与抽象类
反射(原理与常用方法)
复制(深拷贝和浅拷贝)
Java异常体系(分类)

final
==和equals区别
hashCode和equals区别
String、StringBuilder、StringBuffer区别(可变性 安全性)
List和Set区别
ArrayList、LinkedList、Vector区别(链表/数组/数组 不安全/不安全/安全 队列//)
HashMap和HashTable区别(父类 hash 安全)
HashMap扩容过程/扩容原理
HashMap的put方法过程
HashMap的容量和扩容为什么是2倍(索引高位区别减少移动 减小hash碰撞)
Java1.7/1.8中HashMap区别
泛型中extends和super区别

遇到过的设计模式
设计模式分类及常见设计模式(3)
单例模式最健壮实现方案(静态内部类&枚举)

String对象如何修改值但不修改地址
String.intern方法
IntegerCache的数据范围(-128~127)
List有哪些实现类(ArrayList、LinkedList、Vector)

Object中方法(equals hashCode clone wait notify notifyAll getClass toString)
Object.clone(浅拷贝 深拷贝需实现Cloneable接口并重写clone方法)
Object.toString(类型名称+hashcode)
String.toString(返回String对象)
String为什么不可改变(private final cha value[])

接口类多继承
普通类单继承
接口类多实现

基础数据类型
(byte short int long float double char boolean)
为什么使用包装类(面向对象思想 便于操作)
HashMap为什么不使用二叉树(二叉树极端情况退化为链表)
HashMap、ConcurrentHashMap的k/v是否允许null值(允许/不允许)

数据结构与算法

图的深度遍历与广度遍历
二叉搜索树和平衡二叉树区别
强平衡二叉树与弱平衡二叉树区别
B树和B+树区别、MySQL为什么使用B+树
快排算法

线程与并发

进程和线程的区别
线程生命周期与状态
线程安全如何理解
守护线程如何理解

如何开启线程
如何保证线程安全
并发、串行和并行区别
并发三特性/并发三要素
volatile特性及其原理
Synchronized特性及其原理
volatile和Synchronized区别
volatile能否保证线程安全
Synchronized锁机制
偏向锁 轻量级锁 重量级锁(膨胀方向&实现方式&适合场景)
Thread和Runable区别(sleep join interrupt yield)
sleep、wait、join和yield区别
LockSupport.park、LockSupport.unpark和wait、notify的区别
notify和notifyAll区别
interrupt机制
start和run区别
如何给run方法传参
如何实现处理线程返回值

Synchronized放在静态方法和普通方法上的区别

CAS简述(3参数)

AQS简述
ReentrantLock公平锁和非公平锁底层实现
ReentrantLock中lock和trylock区别
ReentrantLock和Synchronized区别
CountDownLatch和Semphore区别及底层原理
如何实现可重入

3个线程 如何实现同时执行 顺序执行 交替执行

简述线程池原理(组成+提交任务逻辑)
线程池7大参数
为什么使用线程池(3优点)
线程池工作流程/线程池工作原理
FixedThreadPool阻塞队列是什么
线程池中阻塞队列作用(缓存任务&控制线程)
线程池中线程复用原理
为什么先入队列后创建非核心线程
FutureTask Worker
不建议使用Executor建立线程池

Java1.7/1.8中ConcurrentHashMap区别
ConcurrentHashMap原理及其扩容原理
ConcurrentHashMap如何保证线程安全
CopyOnWriteArrayList底层原理
ThreadLocal原理与使用场景
ThreadLocal内存泄漏原因

如何查看线程死锁(内存&数据库)
线程通讯4方式
Java死锁如何避免
线程池队列已满提交任务时会发生什么
线程池提交任务加入工作队列还是创建线程
线程池配置(核心线程数a 最大线程数b 队列长度c 处理器核数d)
线程池拒绝策略(抛异常 抛弃新任务 抛弃旧任务 使用提交现场处理任务)
(IO密集型a=d/(1-阻塞系数) 阻塞系数为0.8~0.9 b=2a c=1)
(CPU密集型:a=d+1 b=2a c=4a)
(即时响应:调高线程数 避免缓冲 动态调整)
(非即时响应:线程数可小一点 利用缓冲达到最大效率)

如何排查接口慢(内存操作&线程操作&外部接口&数据库)
如何排查系统卡(内存操作&线程操作&外部接口&数据库)
ReentrantLock公平锁加解锁过程
(获取当前线程 -> 若state变量为0且无等待线程 -> 则使用CAS获取锁并设置锁持有者 -> 若锁为本线程持有 -> 则state加1重入 -> 不满足则失败)
(若锁为本线程持有 -> state减1释放锁 -> 若state为0返回true反之返回false)
ReentrantLock非公平锁加锁过程
(使用CAS获取锁 失败继续 -> 获取当前线程 -> 若state变量为0 -> 则使用CAS获取锁并设置锁持有者  -> 若锁为本线程持有 -> 则state加1重入 -> 不满足则失败)
AQS哪些是共享锁/排它锁(读锁/信号量 重入锁/写锁)
countDownLatch使用场景(多任务完成后汇总)
加锁失败(addWaiter插入等待队列 -> acquireQueued队列中实现阻塞)
addWaiter(封装新Node -> 获取tail -> tail不为空则添加Node到尾部 -> CAS操作更新tail -> tail为空或更新tail失败 -> 死循环(添加空节点/添加Node到尾部))
acquireQueued(死循环(若为次节点则加锁 -> 删除无效节点 找到前节点修改其waitStatus=-1 -> 挂起) -> 加锁失败则xxx)
ReentrantLock阻塞队列为什么使用双向队列(加入队列时删除无效节点 修改前驱节点waitStatus 唤醒时判断当前为次节点)

java程序cpu高的原因(频繁GC&线程不断执行非阻塞操作如死循环、加解密、序列化)
系统发生full GC的原因
(高并发导致瞬时数据量大 一致性加载过多数据 内存泄漏 System.gc)
用多线程模拟死锁(不能使用Thread.sleep)(重入锁 信号量 Timer TimeUnit)

项目QPS(10~50) 主要业务接口单机约130 集群3
QPS优化(集群 单体)
(单体: 内存操作&线程操作&外部接口&数据库)
(线程池 异步调用/队列解耦 缓存/连接池/sql索引/分库分表/读写分离)
QPS优化实例(减少外部接口调用 基础信息入缓存 优化sql走索引)
SpringBoot项目中接口默认QPS是多少(Tomcat线程和队列)
Tomcat参数(10/minSpareThreads 100/acceptCount 200/maxThreads)


阻塞队列的类型(ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue SynchronousQuere DelayQueue LinkedTransferQueue LinkedBlockingDeque)
阻塞队列的工作原理
(插入->竞争插入锁->条件插入->成功则唤醒获取线程->失败进入等待队列 put)
(获取->竞争获取锁->条件获取->成功则唤醒插入线程->失败进入等待队列 take)
(LBQueue Node 两把锁)
(ABQueue Object[] 一把锁)
(PBQueue Object[] 一把锁 插入排序)
(SyncQueue 不存数据线程交换)
(DQueue 基于PBQueue实现)
线程池类型
(ThreadPoolExecutor: newFixedThreadPool/x/x/LQ newSingleThreadExecutor/1/1/LQ newCachedThreadPool/0/MAX_VALUE/SQ)
(ScheduledThreadPoolExecutor: newSingleThreadScheduledExecutor newScheduledThreadPool)
ScheduledThreadPoolExecutor排序原理(DelayedWorkQueue/小顶堆)
submit和execute区别(参数不同 返回不同)

JVM&GC&类加载

平台无关性
使用字节码的好处
JVM内存分区(共享&私有)
堆内存分区及比例
JVM三大性能调优参数(Xms、Xmx、Xss)
JVM堆区性能调优参数(XX:NewRatio、XX:SurvivorRatio)
JVM中堆栈的区别
元数据区和永久代

对象内存布局(3部分)
对象存活判定
引用计数法和可达性分析法
GCRoot
垃圾回收算法
标记清除、半区复制、标记整理和分代收集
新生代->老年代 GC年龄
YoungGC和FullGC
触发FullGc的情况
(老年代空间不足 System.GC 新生代晋升到老年代对象大小大于剩余空间)
垃圾回收器(Serial、Serial Old、Parallel Scavenge、Parallel Old、G1、ParNew、CMS)
Java8默认垃圾回收器(Parallel Scavenge/半区复制、Parallel Old/标记整理)


类加载过程
加载 连接 初始化 使用 卸载
验证 准备 解析
双亲委派模型
4种类加载器

OMM问题如何处理
JVM问题排查(内存操作&线程操作&外部接口&数据库 挂死&非挂死)
Java1.7/1.8中内存分区变化
Tomcat中为什么使用自定义类加载器
Tomcat如何优化
虚拟机堆内存配置参数(堆最大值 堆最小值 新生代:老年代 eden:from:to)
G1虚拟机使用什么垃圾回收算法(复制)
双亲委派模型优点(类唯一性 安全)
CMS和G1区别(老年代/全部 标记清除内存碎片/标记整理无碎片 并发回收浮动垃圾/筛选回收控制STW)

Spring&SpringBoot

Spring框架简述
AOP理解 
IOC理解
Spring源码及其Spring容器启动过程
Spring事务实现方式
如何实现AOP 使用场景
AOP原理(容器 反射 动态代理 增强)
如何实现一个IOC容器
Spring中后置处理器作用(2)
Spring中常见的设计模式
Bean生命周期
Bean是否线程安全
Bean作用域
Bean自动装配的方式(配置文件&注解)
Bean循环依赖解决方式(内部原理)
@Transactional注解失效原因
ApplicationContext和BeanFactory区别

SpringBoot启动过程
SpringBoot自动配置原理
SpringBoot常用注解及其底层实现(3+n)
SpringBoot配置文件加载顺序
SpringBoot如何启动Tomcat
Starter如何理解

SpringMVC、SpringBoot、Spring区别
SpringMVC工作流程
SpringMVC中组件

其他源码阅读情况
如何实现AOP、AOP使用场景
元注解(Target Rention Documented Inherited)

IOC的实现方式(set注入、构造注入、自动装配)
AOP使用场景(统一日志、权限校验、事务、异常统一处理、返回值统一处理)
Spring中事务类型(声明式事务 编程式事务)
Spring中事务传播(propagation REQUIRED/REQUIRES_NEW/NESTED/SUPPORTS/NOT_SUPPORTED/MANDATORY/NEVER)
REQUIRED/NESTED区别(合并/嵌套)(父-->子 子-/->父)

SPI(接口定义和接口实现分开 Dubbo JDBC)
注入依赖是代理对象还是普通对象(AOP增加类注入时为代理)
bean常用扩展点(Aware接口/InitializingBean接口/DisposableBean接口/BeanPostProcessor)
BeanFactoryPostProcessor
BeanPostProcessor(bean统一处理 增强代理类/公共属性注入)
Spring中事件发布器使用场景(解耦)
SpringBoot如何启动Tomcat(run方法中刷新上下文)
@Autowired和@Resource区别(提供方-Spring/Java 装配方式-按type/按name)
注解实现原理(反射)

设计模式实践

策略模式范例
SmartApplicationListener
ResponseBodyAdvice/RequestBodyAdvice
HandlerMapping

状态机

Mybatis

Mybatis优缺点(3/1)
#{}和${}区别
Mybatis一级缓存与二级缓存定义(SqlSession、SqlSessionFactory)
Mybatis一级缓存与二级缓存区别
	范围:会话周期/应用程序周期  事务提交会话结束
	共享:会话内共享/多会话共享
	实现:HashMap/Cache接口
	规则:默认开启 不能关闭/手动开启 可关闭

MySQL

自定义数据库

索引基本原理
索引设计原则
索引数据结构种类及其优劣
B树和B+树区别 MySQL为什么使用B+树
聚簇索引和非聚簇索引区别
索引类型及其影响
最左匹配原则
3层B+树可存储多少数据
覆盖索引/索引覆盖
回表

事务定义
事务4特性
事务隔离级别及3并发问题
ACID如何保证

锁分类
InnoDB锁算法	
Next-key锁
MVCC简述

InnoDB如何实现事务
InnoDB中RR级别如何避免幻读
InnoDB中RC、RR如何实现非阻塞读

MyISAM和InnoDB区别
MySQL执行计划怎么看
Explain语法中各字段含义
MySQL主从同步原理
MySQL主从搭建

SQL不走索引的原因
慢查询优化方法
(服务层->引擎层->数据表->硬件与网络)

MySQL深度分页(业务规避 走索引且只查id 避免回表)
MySQL快照可见性算法
(本事务提交永远可见/其他事务版本未提交不可见 版本提交晚于创建快照则不可见 反之则可见)
如何规避数据库死锁(分布式情况)
(读写分离 降低隔离级别 事务细粒度化 事务简单化 统一加锁顺序 尽量走主键索引)

JOIN和子查询的区别(JOIN可使用索引 子查询为临时表)
子查询的类型(from where exists in)
主键为什么采用long类型
(system const eq_ref ref range index all)
Explain中type中system含义(只有一行数据)
数据库存储冗余字段优劣(减少联表提高效率/数据实时性差)
数据库主键类型选择(自增/uuid/雪花long)
(自增: 单机递增 竞争自增锁 非分布式唯一不利于迁移)
(uuid: 非递增/维护主键索引需频繁移动节点 存储空间大 占用索引空间大/查询效率低 分布式唯一)
(雪花long: 单机递增 分布式唯一)

分布式

基础
	集群与分布式区别
	集群 分布式 微服务
	CAP理论
	BASE理论
	负载均衡算法/负载均衡策略
	(随机 加权随机 轮询 加权轮询 源地址hash)
	数据一致性模型(强弱)
	分布式id解决方案(uuid 雪花算法)
	分布式锁解决方案(数据库 Redis zk)
	分布式事务解决方案(7)
	(两阶段提交 三阶段提交 TCC saga 最大努力通知 本地消息表 事务消息)
	接口幂等性如何实现(消息/请求id预存)
	分布式系统设计目标
	(可扩展 高可用 高可靠)
事务
	分布式事务解决方案(3)
	(两阶段提交 三阶段提交 TCC saga 本地消息表 事务消息 最大努力通知)
	两阶段提交和三阶段提交区别
	两阶段提交(准备/提交 小事务同步阻塞 协调者故障阻塞 网络分区数据不一致)
	三阶段提交(询问/准备/提交 小事务超时提交 询问阶段尽早发现问题)
服务
	RPC如何理解
	Zeekeeper
	Dubbo
存储
	分库分表实现方式
	存储拆分后唯一主键
	雪花算法原理
	不分区键查询问题
	session分布式方案
缓存
	缓存雪崩、缓存击穿和缓存穿透(原因&解决方案)
	常用缓存方案(客户端 cdn nginx 内部缓存 外部缓存 DAO层缓存 mysql缓存)
	如何保证数据库和缓存的一致性
	先更新数据库 后删除缓存的优缺点(只有短期不一致)
	缓存过期策略(1+4+3)
	缓存淘汰算法(3)
	布隆过滤器优缺点
	分布式缓存寻址(哈希、一致性哈希、槽位)
	Redis
高可用
	服务降级&服务熔断
	服务雪崩&服务限流

幂等性简述(同一操作发起多次请求时结果必须一致/Redis缓存消息id/数据库字段唯一)
复杂服务拆分方案(SpringCloudAlibaba/Nacos/feign/Seata/RocketMQ/Redis/网关...)

Redis

Redis数据结构及其使用场景
(String List Hash Set SortSet)
(简单动态字符串 压缩列表/双向链表 压缩列表/字典 整数集合/字典 跳跃表/压缩列表)
Redis数据结构对应的底层数据结构
海量数据查询固定前缀key
Redis分布式锁实现(问题&解决方案)
异步队列实现
RDB和AOF持久化机制
Redis过期键删除策略
Redis快的原因(IO多路复用 单线程 内存操作)
Redis事务实现
Redis缓存过期策略(2)
Redis缓存淘汰策略(1+4+3)
Redis缓存淘汰算法(random LRU LFU)
LRU数据结构实现方案
LFU数据结构实现方案
Redis高可用方案/集群策略
Redis主从复制原理
缓存雪崩、缓存击穿和缓存穿透(原因&解决方案)
Redis雪崩如何处理(预热&随机过期&使用锁降低并发&使用队列串行化&限流和降级)
Redis和Mysql数据一致性(4+1)

为什么使用缓存
海量数据如何找到一条记录(利用Redis建立key-value)
单个redis服务挂死的原因
Redis混合持久化模式数据备份逻辑(rdb正常 AOF文件=rdb+增量命令)
分布式锁和普通SET区别(SET覆盖 SETNX为key不存在时赋值)

一致性哈希和普通哈希对比(服务器数量变化导致缓存迁移)
一致性哈希和哈希槽对比(可手动分布/节点变化时高可用方案不同/引起雪崩)
Raft选举算法

Netty

Netty是什么
Netty线程模型
Netty高性能原因(4)
(NIO 零拷贝 单线程处理消息 protobuf序列化)
Netty为什么不使用AIO
(Linux上AIO使用epoll Reactor和Proactor Linux上AIO不成熟)

Nginx

Nginx有哪些作用(反向代理/负载均衡/动静分离)

Feign

Feign底层原理(启动注解 扫描接口类生成实例 扫描方法到容器 动态代理调用方法 组装参数)
Feign调用接口异常解决方案(熔断/超时/补偿机制)

Nacos

Nacos中服务调用过程(生产端注册并健康检测,消费端定时更新路由,注册中心推送更新,根据路由调用)
Nacos支持CP+AP(注册配置ephemeral=true/false  AP/CP 默认AP)	
Nacos挂死服务间是否能访问(可使用不可更新)
Nacos动态配置原理(动态配置+实时刷新bean+客户端定时拉取+注册中心推送更新)
(动态数据源+流量调度)
注册中心选型(一致性协议/健康检测方式/负载均衡策略/雪崩保护)
(Nacos/CP+AP Zeekeeper/CP Eureka/AP)

Hystrix

熔断器原理(时间窗内请求错误比例大于阈值)

xxl-job

xxl-job解决重复调度(任务分片查询/id取模)
xxl-job海量任务调度(分片广播 执行器分片查询)
xxl-job负载均衡策略(随机/轮询/一致性哈希/LRU/LFU...)
elastic-job和xxl-job(依赖-多/少 适合-数据量和服务器数量大/数据量和服务器数量相对不大)

消息中间件

消息队列优缺点(3/3)
(解耦 异步 削峰)(复杂度 多发少发 重复消费 一致性)
消息队列的作用(解耦 异步 削峰)
死信队列简述
延时队列简述
如何保证消息不被重复消费(幂等性)
4大消息队列中间件对比(吞吐量 Topic 可靠性 丢失率)

RabbitMQ(忽略)
ActiveMQ(忽略)

RocketMQ架构/底层实现原理
RocketMQ事务消息(发送半消息->执行事务操作->提交/回滚->超时检测事务操作 消费端+MQ保证消费成功)
RocketMQ顺序消息(版本号 单队列)
(生产者发送时确定queue/MQ队列存储/消费者加锁队列单线程消费)
RocketMQ持久化机制
RocketMQ与零拷贝
RocketMQ如何保证不丢消息/如何保证消息可靠传输
(生产者 -> broker -> 消费者)
生产者不多发不少发(多发属于异常 发送失败需重试)
broker存储(单体持久化 集群容灾与备份)
消费者不重复消费(消费失败需重试 重复消费需幂等)	
事务消息一致性
(生产者不少发 消费者幂等 broker不丢消息)

RocketMQ(n主n从 同步复制)
RocketMQ 消息积压原因(生产者瞬时生成大量消息 网络问题 消费者bug/消费者速度慢)
RocketMQ 消息积压如何处理(生产者业务降级 mq扩容与熔断 消费者逻辑优化/消费者实例增加/灰度发布)
RocketMQ 消息积压条件(ProcessQueue 数量大于1000/大小大于100M/消息偏移量差大于2000/顺序消息加锁失败)
消费者速度慢(业务逻辑复杂/外部接口响应慢/数据库操作慢)
消费者逻辑优化(异步重试/熔断/消息本地存储)	
RocketMQ rebalance(平均负载 环形分配 一致性hash 自定义分配 机房就近分配 机房绑定分配)
生产者海量消息如何确保

kafka高性能原因(磁盘顺序读写 零拷贝 消息批量压缩处理/异步)
kafka处理消息顺序、重复发送、重复消费和消息丢失
kafka为什么比RocketMQ吞吐量高(压缩/异步)
kafka消息丢失解决方案
kafka的pull和push优缺点
kafka架构设计
kafka副本同步机制
kafka消息高可靠解决方案
kafka的rebalance机制
kafka中zk的作用

自定义MQ(单体队列-分布式集群-Topic与路由-可靠连接-日志与备份-其他如事务消息延时队列)
RocketMq和kafka选型
(业务/日志 持久化-同步异步/异步 队列多时性能-低/高 队列数-5W/64W 消费失败-可重试/不可 延时消息事务消息-支持/不支持)

Dubbo

Dubbo简述(作用)
Dubbo工作流程
Dubbo架构及其分层设计
(代理 注册 调用 传输 序列化)
Dubbo如何做系统交互
(引入调用 Reference接口解析生成bean 封装Invocation 获取路由 请求并获取结果)
(暴露 Service接口解析 封装ServiceBean 注册路由 心跳检测)
Dubbo负载均衡策略(5)
(加权随机 加权轮询 一致性hash)
Dubbo如何完成服务导出/服务暴露
Dubbo如何完成服务引入
Dubbo服务调用过程
Dubbo架构设计(注册中心 提供者 消费者 监控 容器)
Dubbo支持的哪些注册中心
Dubbo集群容错策略有哪些
Dubbo的SPI机制
Dubbo为什么不使用JDKSPI而自实现SPI
Dubbo中ZK集群挂死 发布者和订阅者还能通信吗
Dubbo支持的协议

Zookeeper

ZAB协议
为啥Zookeeper可做注册中心
Zookeeper领导者选举流程
Zookeeper集群之间数据如何同步
Zookeeper数据同步原理
Zookeeper初始化选举和崩溃选举过程
Zookeeper数据模型和节点类型
Zookeeper命名服务、配置管理和集群管理
Zookeeper的watch机制实现原理
Zookeeper分布式锁实现原理
Zookeeper典型应用场景
Zookeeper某个客户端修改节点数据 其他客户端能获取最新数据吗
Zookeeper对事物的支持
Zookeeper观察者机制
Zookeeper会话管理机制
Zookeeper和Eureka对比
Zookeeper如何存储生产者和消费者信息

SpringCloud

SpringCloud各组件功能 
SpringCloud与Dubbo区别
Seata(XA 'AT' TCC Seaga 前3者均有参与者/协调者)
XA(完全隔离/强一致性/性能低
   一阶段:开启全局事务/注册分支事务/执行sql 
   二阶段:检测分支事务/全部成功则全局事务成功)
AT(全局锁隔离/弱一致性/性能高
   一阶段:开启全局事务/注册分支事务/执行sql并提交事务/记录undo.log 
   二阶段:检测分支事务/全部成功则删除记录undo.log/反之利用undo.log回滚)
TCC(Try/Confirm/Cancel/资源预留隔离/弱一致性/性能高/侵入式
   一阶段:开启全局事务/注册分支事务/占据资源
   二阶段:成功则Confirm提交 失败则执行Cancel释放资源)

参考文献

你可能感兴趣的:(java)