spring-tx-3

83 阅读1分钟

seata

key

TC、TM、RM

  • TC (Transaction Coordinator) - 事务协调者
  • TM (Transaction Manager) - 事务管理器(全局)
  • RM (Resource Manager) - 资源管理器(分支事务)

AT

可能存在的问题

  • 本地锁和全局锁容易形成死锁/长事务 => 解决的方法是全局锁超时
  • 本地锁是共享的,应该不适合分布式数据库,要求数据库单一节点(基于本地事务实现的),不够HA
  • 通过select for update对事务加读锁,防止读脏数据
  • 为什么删除回滚日志(commit的日志)
  • 全局锁的管理是个问题
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,  // PK
  `branch_id` bigint(20) NOT NULL,    // union-UK
  `xid` varchar(100) NOT NULL,        // union-UK
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

TCC

  1. prepare(资源预留|冻结)
  2. commit || rollback

可能存在的问题

  • rollback|冻结 时效性问题
  • 通过本地事务融于全局事务,怎么实现commit| rollback 成功? 实现比较简单,适合结合本地事务

SAGA

长事务解决方案

可能存在的问题

  • 事务链,commit链 -> rollbackl链; 链的第一个节点锁的时间估计会特别长
  • 暂时没看到怎么解决长事务、全局事务管理方案
  • JOSN 状态机
  • 空补偿、悬挂、幂等、=>解决分布式事务带来更多的分布式问题,不是好解决方案(边际成本增加)

XA

可能存在的问题

  • XA协议管理分支事务