什么是事物?
事务就是在进行数据库的一系列操作时,这些操作要么同时完成,要么同时失败。
事物的特性?
1.原子性
保证了事务的操作时原子的,不可在拆分的,是事物的最小操作单元,所包含的操作视为一个整体,在执行过程中要么全部成功,要么全部失败,不存在一些成功一些失败的情况。
2.一致性
保证了数据库的数据状态变化是一致的,从一个一致的状态改变到另一个一致的状态,一致性和原子性是密不可分的。
3.隔离性
要求事务之间是相互独立的,一个事务不能被其他事务干扰,其他事务只能在这个事务commit之后才能对该数据进行其他操作。
4.持久性
一个事务一旦提交,数据库数据就会更改,就会刷盘,不会在受到其他操作的影响
如何使用事务
在spring中使用@Transacitional 注解可开启事务
try {
/*开启事务 手动提交*/
conn.setAutoCommit(false);
// TODO 代码
conn.commit();
} catch (Exception throwables) {
//出现异常回滚事务
conn.rollback();
}
@Transacitional 的生效使用了 cglib 的代理AOP(DataSourceTransactionManager)
什么是分布式事物?
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
分布式项目下,同一个资源同时操作多个数据库多张表会产生数据不一致的问题。
CAP定律
C:Consistency 一致性
在分布式系统中的所有数据备份,在同一时刻是否同样的值。
A:Availability(可用性)
在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求
P:Partition tolerance(分区性)
以实际效果而言,分区相当于对通信的时限要求,系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
CP,AP 三者不能同时存在,分布式使用高可用还是高一致性根据实际情况决定,若没有P的特性,就没有集群可言!
SeataAT模型
需要先了解TC,TM,RC
TC:事物协调组 (seata)
TM:事物管理器 (请求的入口服务)
RM:资源管理器 (数据库操作的服务)
假如存在两个银行卡ICBC和ABC,ICBC转账到ABC中
1.用户使用ICBC网ABC转账时,调取ICBC的转账接口,此时ICBC-SERVER就是一个TM,此时seata会开启一个唯一ID的事物组,同时会写到galoba_table表中。
2.icbc加入到这个事务组中
3.执行业务代码,同时生产beforeImage和afterImage和本地事务一起提交,调用feign的接口来操作abc-service,seata会对fegin进行包装让fegin带上唯一的XID
4.abc-service加入到事务组,同时会写到galoba_table表中。
5.执行业务代码,同时生产beforeImage和afterImage和本地事务一起提交。
6.TM告诉seata事务是成功还是失败
7.seata告诉icbc-service和abc-service 是commit 删除log 还是 失败 执行rollback