Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Zh1Cheung/tyloo

Repository files navigation

tyloo

Distributed transaction framework——TCC

概念

  • Try: 尝试执行业务

    • 完成所有业务检查(一致性)
    • 预留必须业务资源(准隔离性)
  • Confirm: 确认执行业务

    • 真正执行业务
    • 不作任何业务检查
    • 只使用Try阶段预留的业务资源
    • Confirm操作满足幂等性
  • Cancel: 取消执行业务

    • 释放Try阶段预留的业务资源
    • Cancel操作满足幂等性

环境

  • Java
  • Maven
  • Git
  • MySQL
  • Redis
  • Zookeeper
  • Intellij IDEA

功能

  • 基于 Spring AOP 切面思想实现对分布式事务注解的拦截。
  • 基于Dubbo的ProxyFactory代理机制为服务接口生成代理对象。
  • 基于Mysql、Redis乐观锁进行事务版本控制以及基于基于Quartz进行事务恢复。
  • 支持多种事务日志序列化以及事务存储器实现。
  • 调用方式(版本):Dubbo、HTTP

业务场景

运行

  1. 导入数据库脚本tyloo/tyloo-tutorial-sample/src/tylooSampledb
  2. 修改三个配置文件tccjdbc.properties
  3. 修改三个子项目(capital、redpacket、order)的启动配置:HTTP port

模块

  • 两个拦截器

    • 通过对 @Tyloo AOP 切面( 参与者 try 方法 )进行拦截,透明化对参与者confirm / cancel 方法调用,从而实现 TCC
  • 事务与参与者

    • TCC 通过多个参与者的 try / confirm / cancel 方法,实现事务的最终一致性
    • Tyloo 将每个业务操作抽象成事务参与者
  • 事务管理器

    • 提供事务的获取、发起、提交、回滚,参与者的新增等等方法。
  • 事务存储器

    • 提供对事务对象的持久化
  • 事务注解

    • 传播级别
    • 确认/取消执行业务方法
    • 事务上下文编辑
  • 事务恢复

    • 事务信息被持久化到外部的存储器中。事务存储是事务恢复的基础。通过读取外部存储器中的异常事务,定时任务会按照一定频率对事务进行重试,直到事务完成或超过最大重试次数。

流程

  • 因为对远程业务的调用需要用到代理对象,代理对象由dubbo service生成,TRY阶段在进行远程调用前需要调用代理对象(代理对象的confrimmethod和cancelmethod均和try方法名字相同),此时拦截器会进行拦截代理对象,拦截后调用远程业务,远程业务(远程业务本地有个本地事务保证执行成功)也会被拦截,然后远程业务执行。COMMIT阶段时主业务执行完comfirm方法后代理对象执行comfirm方法(confirm方法均为反射调用),但是代理对象的confirm方法还是代理对象的try方法,此时再被拦截器拦截,因为此时代理对象的事务状态已经改为CONFIRMING,由于事务类型为defalut(因为代理对象的传播级别默认为SUPPORT),所以直接过了。此时再调用远程业务的try方法,走拦截,invoke反射的时候反射远程业务的confrim方法,因为try方法做了幂等所以直接过了,此时远程业务的commit阶段完成,然后继续下一个远程业务。最后根事务提交,完成。

About

Distributed transaction framework——TCC

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /