Seata入门系列【17】会话存储模式

这篇具有很好参考价值的文章主要介绍了Seata入门系列【17】会话存储模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

之前我们了解到TC (Transaction Coordinator) - 事务协调者,负责维护全局和分支事务的状态,驱动全局事务提交或回滚。

也了解到Seata 中undo_log、global_table、branch_table、lock_table表字段及作用详解

2 会话存储模式

在服务端,需要存储事务会话信息,支持以下几种方式:

  • file本地文件(不支持HA),
  • db数据库(支持HA)
  • redis(支持HA)

2.1 文件

我们采用的是file 作为配置中心,所以会话存储模式在file.conf配置文件中修改,如果使用其他方式,在对应的配置中心中修改即可。
Seata入门系列【17】会话存储模式,seata,微服务,seata,后端,分布式事务,微服务,java
在file.conf文件中修改mode为file,然后添加相关配置即可,全部配置参数如下所示:

## 事务日志存储,仅在seata服务器中使用
store {
  ## 存储模式: file、db、redis
  mode = "file"
  ## rsa解密公钥
  publicKey = ""
  ## 文件存储配置
  file {
    ## file模式文件存储文件夹名,默认sessionStore
    dir = "sessionStore"
    # 分支会话最大值,如果超出抛出异常
    maxBranchSessionSize = 16384
    # 全局事务最大值,如果超出抛出异常
    maxGlobalSessionSize = 512
    # 文件缓冲区大小,如果超过,请分配新缓冲区
    fileWriteBufferCacheSize = 16384
    # 恢复批读取大小
    sessionReloadReadSize = 100
    # 刷新文件夹异步或同步
    flushDiskMode = async
  }
}

可以看到,在执行全局事务后,会在sessionStore文件夹下生成一个root.data文件,打开文件后可读性很差。
Seata入门系列【17】会话存储模式,seata,微服务,seata,后端,分布式事务,微服务,java
优点:

  • 速度快

缺点:

  • 无法实现会话共享,所以不支持集群模式
  • 可读性差,无法查询事务及全局锁信息

总结: 不推荐使用,其重要原因是,一旦发现报错,需要手动处理时,无法查看到具体的事务信息。

2.2 数据库

db模式,采用数据库存储会话信息,支持mysql、oracle、db2、sqlserver、sybaee、h2、sqlite、access、postgresql、oceanbase。

使用的使用需要同步以下三张表:

  • global_table:全局事务
  • branch_table:分支事务
  • lock_table:全局锁

然后在file.conf文件中添加数据库信息:

store {
  ## store mode: file、db、redis
  mode = "db"
  ## rsa decryption public key
  publicKey = ""
  ## database store property
  db {
    ## db模式数据源类型,dbcp、druid、hikari;无默认值,store.mode=db时必须指定。
    datasource = "druid"
    ## db模式数据库类型 mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    ## 数据库地址,在使用mysql作为数据源时,建议在连接参数中加上rewriteBatchedStatements=true
    url = "jdbc:mysql://127.0.0.1:3306/t_seata?rewriteBatchedStatements=true"
	## 数据库账户
    user = "root"
	## 数据库账户密码
    password = "123456"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

优点:

  • 支持集群
  • 事务信息可视化,可读性高

缺点:

  • 需要同步数据结构
  • 依赖数据库,效率不太高

2.3 Redis

redis 模式,采用redis 会话信息,Seata 1.4 以后支持的新模式。

在file.conf文件中修改mode为redis,然后添加相关配置即可,全部配置参数如下所示:

  ## redis store property
  redis {
    ## redis 模式: 单机 、哨兵
    mode = "single"
    ## 单机配置
    single {
      host = "127.0.0.1"
      port = "6379"
    }
    ## 哨兵模式配置
    sentinel {
      masterName = ""
      ## such as "10.28.235.65:26379,10.28.235.65:26380,10.28.235.65:26381"
      sentinelHosts = ""
    }
    # Redis密码
    password = "123456"
    database = "0"
    minConn = 1
    maxConn = 10
    maxTotal = 100
    queryLimit = 100
  }

可以在Redis 中看到存储的会话信息:
Seata入门系列【17】会话存储模式,seata,微服务,seata,后端,分布式事务,微服务,java
优点:

  • 支持集群
  • 事务信息可视化,可读性高
  • 效率较快
  • 无需要同步数据结构

缺点:

  • 依赖Redis

3 怎么选择?

从操作性、效率、功能性综合考虑,肯定是使用Redis 了。

4 会话管理器SessionManager

在Seata 中,实现会话增删改查,是通过SessionManager的实现类来处理的,它的三个实现类就对应了三个存储方式:
Seata入门系列【17】会话存储模式,seata,微服务,seata,后端,分布式事务,微服务,java
SessionManager 接口源码如下:文章来源地址https://www.toymoban.com/news/detail-735432.html

/**
 * The interface Session manager.
 *
 * @author sharajava
 */
public interface SessionManager extends SessionLifecycleListener, Disposable {

    /**
     * Add global session.
     *
     * @param session the session
     * @throws TransactionException the transaction exception
     */
    void addGlobalSession(GlobalSession session) throws TransactionException;

    /**
     * Find global session global session.
     *
     * @param xid the xid
     * @return the global session
     */
    GlobalSession findGlobalSession(String xid) ;

    /**
     * Find global session global session.
     *
     * @param xid the xid
     * @param withBranchSessions the withBranchSessions
     * @return the global session
     */
    GlobalSession findGlobalSession(String xid, boolean withBranchSessions);

    /**
     * Update global session status.
     *
     * @param session the session
     * @param status  the status
     * @throws TransactionException the transaction exception
     */
    void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status) throws TransactionException;

    /**
     * Remove global session.
     *
     * @param session the session
     * @throws TransactionException the transaction exception
     */
    void removeGlobalSession(GlobalSession session) throws TransactionException;

    /**
     * Add branch session.
     *
     * @param globalSession the global session
     * @param session       the session
     * @throws TransactionException the transaction exception
     */
    void addBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException;

    /**
     * Update branch session status.
     *
     * @param session the session
     * @param status  the status
     * @throws TransactionException the transaction exception
     */
    void updateBranchSessionStatus(BranchSession session, BranchStatus status) throws TransactionException;

    /**
     * Remove branch session.
     *
     * @param globalSession the global session
     * @param session       the session
     * @throws TransactionException the transaction exception
     */
    void removeBranchSession(GlobalSession globalSession, BranchSession session) throws TransactionException;

    /**
     * All sessions collection.
     *
     * @return the collection
     */
    Collection<GlobalSession> allSessions();

    /**
     * Find global sessions list.
     *
     * @param condition the condition
     * @return the list
     */
    List<GlobalSession> findGlobalSessions(SessionCondition condition);

    /**
     * lock and execute
     *
     * @param globalSession the global session
     * @param lockCallable the lock Callable
     * @return the value
     */
    <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
            throws TransactionException;

    /**
     * scheduled lock
     *
     * @param key the lock key
     * @return the boolean
     */
    default boolean scheduledLock(String key) {
        return true;
    }

    /**
     * un scheduled lock
     *
     * @param key the lock key
     * @return the boolean
     */
    default boolean unScheduledLock(String key) {
        return true;
    }

}


到了这里,关于Seata入门系列【17】会话存储模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务13-Seata的四种分布式事务模式

    XA模式分为两种情况 : 提交成功: 提交失败: 具有强一致性seata相当于是在RM上做了一层封装; XA模式 优点 : 1.事务的强一致性,只要有失败的,TC事务协调者就会发送信息让RM回滚——满足ACID原则 2.没有代码侵入,常用数据库都支持 缺点 : 1.第一阶段就要锁定数据库资源

    2024年02月07日
    浏览(43)
  • Java微服务分布式事务框架seata的TCC模式

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月23日
    浏览(45)
  • Seata AT模式源码解析一(Seata Server端启动流程)

    seata-server的入口类在Server类中,源码如下: 在阅读源码的时候,有些源码是要细看的,但是有些源码可以大致猜测一下它的作用,就直接略过去了,抓住真正的重点去看。 SessionHolder负责Session的持久化,一个session对象代表一个事务。SessionHolder包含了4个session管理器,用来操

    2024年02月07日
    浏览(38)
  • 【Seata】微服务集成seata

    Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同 开源的分布式事务解决方案。 官网http://seata.io/ Seata事务管理有三个角色: TC (Transaction Coordinator) - 事务协调者 : 维护全局和分支事务的状态 ,协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 : 定义全局事务的范围

    2024年02月16日
    浏览(39)
  • saga模式、Seata saga模式详解

    2023年04月15日
    浏览(34)
  • Seata XA模式和AT模式的区别

    Seata  XA模式和AT模式都是分布式事务解决方案Seata中的两种实现方式。 XA模式: XA模式是基于数据库的两阶段提交协议实现的一种分布式事务解决方案。 在XA模式下,Seata会将分布式事务分为全局事务和各个分支事务。 全局事务由事务协调器(TC)统一管理,分支事务由不同的

    2024年02月12日
    浏览(32)
  • SpringCloud集成Seata saga模式案例

    2023年04月09日
    浏览(36)
  • Seata - 入门笔记

    1、事务 访问并可能更新数据库中数据库中各种数据线的一个程序执行单元 原子性:事务是一个不可分割的工作单位,一个事务要么都做要么都不做 一致性:必须是使数据库从一个一致性到另一个一致性的状态,中间状态不能被观察到 隔离性:一个事务的执行不能被其他事

    2024年02月13日
    浏览(28)
  • Seata入门

    Seata: Simple Extensible Autonomous Transaction Architecture Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 —— 引用自 SEATA 官方文档 开源时间:2019年1月

    2024年02月19日
    浏览(31)
  • docker-compose 部署 Seata整合nacos,Postgresql 为DB存储

    详情环境可参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 我这里 所有选择seata版本为 1.3.0 前提:已经安装好nacos和postgresql 创建好数据库 名称:seata 执行以下sql: 其他的sql可以参考: https://github.com/seata/seata/tree/develop/script/server/db 服务器层级结构: 2

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包