-------------------------------------------
一、本地事务的介绍
1、什么是事务?
事务:一次执行多条sql语句,要么全部执行,要么全部回滚
2、事务的特性
原子性(a):要么全部执行,要么全部回滚
一致性(c):事务执行前后结果都是正确的
隔离性(i):一个事务commit前,任何事务都看不到
持久性(d):事务一单提交不可再回滚
3、mysql提供的事务命令
BEGIN TRANSACTION:记录undo_log
COMMIT:删除undo_log
ROLLBACK:从undo_log恢复数据
4、jdbc控制事务
conn.setAutoCommit(false); //BEGIN TRANSACTION
try{
stmt.executeUpdate(sql1);
stmt.executeUpdate(Sql2);
int a=6/0;
.
.
.
conn.commit(); //COMMIT
}
catch(Exception e) {
...
conn.rollback(); //ROLLBACK
}
5、spring的aop控制事务
@Transactional
public void insertOrder(TbOrder tbOrder) {
//1、保存订单
tbOrderMapper.insertSelective(tbOrder);
//2、扣减库存
itemServiceFeign.updateItem(tbOrder.getItemId(), tbOrder.getNum());
}
二、分布式事务产生的场景
1、多个服务,一个数据库
2、一个服务,多个数据库
3、多个服务,多个数据库
三、seata的核心组件
TM(Transaction Manager)-事务管理器:定义全局事务的范围,调用TC(@GlobalTransaction)
TC(Transaction Coordinator)-事务协调器:维护分支事务的状态,协调RM提交或混滚事务(微服务)
TC服务数据表
|
|-global_table
|-branch_table
|-lock_table
RM(Resource Manager)-资源管理器:向TC注册和报告分支事务,并负责分支事务的提交或回滚(connection代理)
order服务数据表
|
|-tb_order
|-undo_log
item服务数据表
|
|-tb_item
|-undo_log
四、seata控制分布式事务
1、pom.xml
spring-cloud-starter-alibaba-seata
2、application.yml
seata:
registry:
type: nacos
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ""
group: DEFAULT_GROUP
application: seata-server
tx-service-group: seata-demo #事务组名称,一般是项目名
service:
vgroup-mapping:
seata-demo: default #映射关系