Seata 学习笔记

环境准备

  • Java运行环境
  • Maven
  • Nacos

  • 了解Spring Boot基础知识
  • Seata架构

资源目录介绍

https://github.com/seata/seata/tree/master/script

  • client

    存放client端sql脚本 (包含 undo_log表) ,参数配置

  • config-center

    各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件

  • server

    server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置

注意事项

  • seata-spring-boot-starter
内置GlobalTransactionScanner自动初始化功能,若外部实现初始化,请参考SeataAutoConfiguration保证依赖加载顺序
默认开启数据源自动代理,可配置seata.enable-auto-data-source-proxy: false关闭

服务端解压后相关表所在位置:

.\seata\script\server\db\

按需选择对应的脚本执行

  • spring-cloud-starter-alibaba-seata推荐依赖配置方式
           <dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>最新版</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
                <version>最新版本</version>
                <exclusions>
                    <exclusion>
                        <groupId>io.seata</groupId>
                        <artifactId>seata-spring-boot-starter</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
步骤一:启动包

        

步骤二:建表(仅db)

全局事务会话信息由3块内容构成,全局事务-->分支事务-->全局锁,对应表global_table、branch_table、lock_table

步骤三:修改store.mode

启动包: seata-->conf-->application.yml,修改store.mode="db或者redis"
源码: 根目录-->seata-server-->resources-->application.yml,修改store.mode="db或者redis"

步骤四:修改数据库连接|redis属性配置

启动包: seata-->conf-->application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。
源码: 根目录-->seata-server-->resources-->application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。

步骤五:启动
  • 源码启动: 执行ServerApplication.java的main方法
  • 命令启动: seata-server.sh -h 127.0.0.1 -p 8091 -m db

注: 堆内存建议分配2G,堆外内存1G

业务系统集成Client

步骤一:添加seata依赖(建议单选)
  • 依赖seata-all
  • 依赖seata-spring-boot-starter,支持yml、properties配置(.conf可删除),内部已依赖seata-all
  • 依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递
步骤二:undo_log建表、配置参数(仅AT模式)
步骤三:数据源代理(不支持自动和手动配置并存)
  1. 如果使用seata-all

    • 0.9.0版本开始seata支持自动代理数据源

      1.1.0: seata-all取消属性配置,改由注解@EnableAutoDataSourceProxy开启,并可选择jdk proxy或者cglib proxy
      1.0.0: client.support.spring.datasource.autoproxy=true
      0.9.0: support.spring.datasource.autoproxy=true
      

      如果采用XA模式,@EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")

    • 手动配置可参考下方的例子

      @Primary
      @Bean("dataSource")
      public DataSource dataSource(DataSource druidDataSource) {
          //AT 代理 二选一
          return new DataSourceProxy(druidDataSource);
          //XA 代理
          return new DataSourceProxyXA(druidDataSource)
      }
      
  2. 如果使用seata-starter

    • 使用自动代理数据源时,如果使用XA模式还需要调整配置文件
      application.properties

      seata.data-source-proxy-mode=XA  
      

      application.yml

      seata:
        data-source-proxy-mode: XA
      
    • 如何关闭seata-spring-boot-starter的数据源自动代理?
      application.properties

      seata.enable-auto-data-source-proxy=false  
      

      application.yml

      seata:
        enable-auto-data-source-proxy: false
      

步骤四:初始化GlobalTransactionScanner
  • 手动
       @Bean
       public GlobalTransactionScanner globalTransactionScanner() {
           String applicationName = this.applicationContext.getEnvironment().getProperty("spring.application.name");
           String txServiceGroup = this.seataProperties.getTxServiceGroup();
           if (StringUtils.isEmpty(txServiceGroup)) {
               txServiceGroup = applicationName + "-fescar-service-group";
               this.seataProperties.setTxServiceGroup(txServiceGroup);
           }
   
           return new GlobalTransactionScanner(applicationName, txServiceGroup);
       }
  • 自动,引入seata-spring-boot-starter、spring-cloud-starter-alibaba-seata等jar
步骤五:实现xid跨服务传递
  • 手动 参考源码integration文件夹下的各种rpc实现 module
  • 自动 springCloud用户可以引入spring-cloud-starter-alibaba-seata,内部已经实现xid传递

业务使用

注解拦截

全局事务
@GetMapping(value = "testCommit")
@GlobalTransactional
public Object testCommit(@RequestParam(name = "id",defaultValue = "1") Integer id,
    @RequestParam(name = "sum", defaultValue = "1") Integer sum) {
    Boolean ok = productService.reduceStock(id, sum);
    if (ok) {
        LocalDateTime now = LocalDateTime.now();
        Orders orders = new Orders();
        orders.setCreateTime(now);
        orders.setProductId(id);
        orders.setReplaceTime(now);
        orders.setSum(sum);
        orderService.save(orders);
        return "ok";
    } else {
        return "fail";
    }
}

TCC
/**
 * 定义两阶段提交 name = 该tcc的bean名称,全局唯一 commitMethod = commit 为二阶段确认方法 rollbackMethod = rollback 为二阶段取消方法
 * useTCCFence=true 为开启防悬挂
 * BusinessActionContextParameter注解 传递参数到二阶段中
 *
 * @param params  -入参
 * @return String
 */
@TwoPhaseBusinessAction(name = "beanName", commitMethod = "commit", rollbackMethod = "rollback", useTCCFence = true)
public void insert(@BusinessActionContextParameter(paramName = "params") Map<String, String> params) {
    logger.info("此处可以预留资源,或者利用tcc的特点,与AT混用,二阶段时利用一阶段在此处存放的消息,通过二阶段发出,比如redis,mq等操作");
}

/**
 * 确认方法、可以另命名,但要保证与commitMethod一致 context可以传递try方法的参数
 *
 * @param context 上下文
 * @return boolean
 */
public void commit(BusinessActionContext context) {
    logger.info("预留资源真正处理,或者发出mq消息和redis入库");
}

/**
 * 二阶段取消方法
 *
 * @param context 上下文
 * @return boolean
 */
public void rollback(BusinessActionContext context) {
    logger.info("预留资源释放,或清除一阶段准备让二阶段提交时发出的消息缓存");
}

切点表达式

全局事务
    @Bean
    public AspectTransactionalInterceptor aspectTransactionalInterceptor () {
        return new AspectTransactionalInterceptor();
    }

    @Bean
    public Advisor txAdviceAdvisor(AspectTransactionalInterceptor aspectTransactionalInterceptor ) {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("配置切点表达式使全局事务拦截器生效");
        return new DefaultPointcutAdvisor(pointcut, aspectTransactionalInterceptor);
    }

关注属性(详细描述见全属性)

server端client端
registry.typeregistry.type
config.typeconfig.type
#store.mode=db需要以下配置service.vgroupMapping.my_test_tx_group
store.db.driverClassNameservice.default.grouplist
store.db.urlservice.disableGlobalTransaction
store.db.user
store.db.password
#store.mode=redis 需要以下配置
store.redis.host
store.redis.port
store.redis.database
store.redis.password

全属性

公共部分

keydescremarkchange record
transport.typesocket通信方式TCP、UNIX_DOMAIN_SOCKET,默认TCP
transport.serversocket通道类型NIO、NATIVE(根据操作系统类型和socket通信方式选择KQueue或Epoll,注意Windows只支持NIO,选择这种方式会抛出异常)
transport.enableTmClientBatchSendRequestTM批量发送请求消息开关默认false1.5.1版本新增
transport.enableRmClientBatchSendRequestRM批量发送请求消息开关默认true1.5.1版本新增
transport.enableTcServerBatchSendResponseTC批量发送回复消息开关默认false1.5.1版本新增
transport.rpcRmRequestTimeoutRM发送请求超时时间默认30秒1.5.1版本新增
transport.rpcTmRequestTimeoutTM发送请求超时时间默认30秒1.5.1版本新增
transport.rpcTcRequestTimeoutTC发送请求超时时间默认30秒1.5.1 版本新增
transport.threadFactory.bossThreadSizeNetty通信模型Boss group线程数默认1
transport.threadFactory.workerThreadSizeNetty通信模型Worker group线程数可配置线程数或选择特定线程工作模式下的线程数,线程的默认工作模式有4种:Auto(2*CPU核数 + 1)、Pin(CPU核数,适用于计算密集型任务)、BusyPin(CPU核数 + 1,适用于计算密集型且内存比较有限的场景)、Default(2*CPU核数,适用于IO密集型任务),默认值为Default模式
transport.shutdown.wait服务端Netty线程池关闭前等待服务下线时间默认3秒
transport.serializationclient和server通信编解码方式seata(ByteBuf)、protobuf、kryo、hession、fst,默认seata
transport.compressorclient和server通信数据压缩方式none、gzip、zip、sevenz、bzip2、lz4、deflater、zstd,默认none1.2.0之前:gzip
1.2.0:zip、sevenz、bzip2
1.3.0:lz4
1.4.1:deflater
1.5.1:zstd
transport.heartbeatclient和server通信心跳检测开关默认true开启
registry.type注册中心类型默认file,支持file 、nacos 、redis、eureka、zk、consul、etcd3、sofa、custom1.6.0版本Sever端支持可同时注册到多个注册中心,以逗号分隔注册中心名
config.type配置中心类型默认file,支持file、nacos 、apollo、zk、consul、etcd3、springcloud、custom

server端

keydescremarkchange record
server.undo.logSaveDaysundo保留天数默认7天,log_status=1(附录3)和未正常清理的undo
server.undo.logDeletePeriodundo清理线程间隔时间默认86400000,单位毫秒
server.maxCommitRetryTimeout二阶段提交重试超时时长单位ms,s,m,h,d,对应毫秒,秒,分,小时,天,默认毫秒。默认值-1表示无限重试。公式: timeout>=now-globalTransactionBeginTime,true表示超时则不再重试(注: 达到超时时间后将不会做任何重试,有数据不一致风险,除非业务自行可校准数据,否者慎用)
server.maxRollbackRetryTimeout二阶段回滚重试超时时长同commit
server.recovery.committingRetryPeriod二阶段提交未完成状态全局事务重试提交线程间隔时间默认1000,单位毫秒
server.recovery.asynCommittingRetryPeriod二阶段异步提交状态重试提交线程间隔时间默认1000,单位毫秒
server.recovery.rollbackingRetryPeriod二阶段回滚状态重试回滚线程间隔时间默认1000,单位毫秒
server.recovery.timeoutRetryPeriod超时状态检测重试线程间隔时间默认1000,单位毫秒,检测出超时将全局事务置入回滚会话管理器
server.rollbackRetryTimeoutUnlockEnable二阶段回滚超时后是否释放锁默认false
server.distributedLockExpireTimeSever端事务管理全局锁超时时间默认10000,单位毫秒1.5.1版本新增
server.server.xaerNotaRetryTimeout防止XA分支事务悬挂的重试超时时间默认60000,单位毫秒1.5.1版本新增
server.session.branchAsyncQueueSize分支事务Session异步删除线程池队列大小默认50001.5.1版本新增
server.session.enableBranchAsyncRemove分支事务Session异步删除开关默认false1.5.1版本新增
server.enableParallelRequestHandle对于批量请求消息的并行处理开关默认false1.5.2版本新增
store.mode事务会话信息存储方式file本地文件(不支持HA),db数据库,redis(支持HA)1.5.1版本改用lock和session分离存储
store.lock.mode事务锁信息存储方式file本地文件(不支持HA),db数据库,redis(支持HA);配置为空时,取store.mode配置项值1.5.1版本新增,session和lock可分离存储
store.session.mode事务回话信息存储方式file本地文件(不支持HA),db数据库,redis(支持HA);配置为空时,取store.mode配置项值1.5.1版本新增,session和lock可分离存储
store.publicKeydb或redis存储密码解密公钥1.4.2版本支持
store.file.dirfile模式文件存储文件夹名默认sessionStore
store.file.maxBranchSessionSizefile模式文件存储分支session最大字节数默认16384(16kb),单位byte
store.file.maxGlobalSessionSizefile模式文件存储全局session最大字节数默认512b,单位byte
store.file.fileWriteBufferCacheSizefile模式文件存储buffer最大缓存大小默认16384(16kb),单位byte,写入session等数据量大于该值时会抛出异常
store.file.flushDiskModefile模式文件存储刷盘策略默认async,可选sync
store.file.sessionReloadReadSizefile模式文件存储Server节点重启后从备份文件中恢复的session或lock key上限个数默认100
store.db.datasourcedb模式数据源类型dbcp、druid、hikari;无默认值,store.mode=db时必须指定
store.db.dbTypedb模式数据库类型mysql、oracle、db2、sqlserver、sybaee、h2、sqlite、access、postgresql、oceanbase;无默认值,store.mode=db时必须指定。
store.db.driverClassNamedb模式数据库驱动store.mode=db时必须指定
store.db.urldb模式数据库urlstore.mode=db时必须指定,在使用mysql作为数据源时,建议在连接参数中加上rewriteBatchedStatements=true(详细原因请阅读附录7)
store.db.userdb模式数据库账户store.mode=db时必须指定
store.db.passworddb模式数据库账户密码store.mode=db时必须指定
store.db.minConndb模式数据库初始连接数默认1
store.db.maxConndb模式数据库最大连接数默认20
store.db.maxWaitdb模式获取连接时最大等待时间默认5000,单位毫秒
store.db.globalTabledb模式全局事务表名默认global_table
store.db.branchTabledb模式分支事务表名默认branch_table
store.db.lockTabledb模式全局锁表名默认lock_table
store.db.queryLimitdb模式查询全局事务一次的最大条数默认100
store.db.distributedLockTabledb模式Sever端事务管理全局锁存储表名默认distributed_lock,多Sever集群下保证同时只有一个Sever处理提交或回滚1.5.1版本新增
store.redis.moderedis模式默认single,可选sentinel1.4.2版本新增sentinel模式
store.redis.single.host单机模式下redis的host,兼容1.4.2之前的版本,该配置为空时选取store.redis.host作为配置项1.4.2版本新增
store.redis.single.port单机模式下redis的port,兼容1.4.2之前的版本,该配置为空时选取store.redis.port作为配置项1.4.2版本新增
store.redis.sentinel.masterNamesentinel模式下redis的主库名称1.4.2版本新增
store.redis.sentinel.sentinelHostssentinel模式下sentinel的hosts多hosts以逗号分隔1.4.2版本新增
store.redis.hostredis模式ip默认127.0.0.11.4.2版本弃用
store.redis.portredis模式端口默认63791.4.2版本弃用
store.redis.maxConnredis模式最大连接数默认10
store.redis.minConnredis模式最小连接数默认1
store.redis.databaseredis模式默认库默认0
store.redis.passwordredis模式密码(无可不填)默认null
store.redis.queryLimitredis模式一次查询最大条数默认100
metrics.enabled是否启用Metrics默认false关闭,在False状态下,所有与Metrics相关的组件将不会被初始化,使得性能损耗最低
metrics.registryType指标注册器类型Metrics使用的指标注册器类型,默认为内置的compact(简易)实现,这个实现中的Meter仅使用有限内存计数,性能高足够满足大多数场景;目前只能设置一个指标注册器实现
metrics.exporterList指标结果Measurement数据输出器列表默认prometheus,多个输出器使用英文逗号分割,例如"prometheus,jmx",目前仅实现了对接prometheus的输出器
metrics.exporterPrometheusPortprometheus输出器Client端口号默认9898

client端

keydescremarkchange record
seata.enabled是否开启spring-boot自动装配true、false,(SSBS)专有配置,默认true(附录4)
seata.enableAutoDataSourceProxy=true是否开启数据源自动代理true、false,seata-spring-boot-starter(SSBS)专有配置,SSBS默认会开启数据源自动代理,可通过该配置项关闭.
seata.useJdkProxy=false是否使用JDK代理作为数据源自动代理的实现方式true、false,(SSBS)专有配置,默认false,采用CGLIB作为数据源自动代理的实现方式
transport.enableClientBatchSendRequest客户端事务消息请求是否批量合并发送默认true,false单条发送
client.log.exceptionRate日志异常输出概率默认100,目前用于undo回滚失败时异常堆栈输出,百分之一的概率输出,回滚失败基本是脏数据,无需输出堆栈占用硬盘空间
service.vgroupMapping.my_test_tx_group事务群组(附录1)my_test_tx_group为分组,配置项值为TC集群名
service.default.grouplistTC服务列表(附录2)仅注册中心为file时使用
service.disableGlobalTransaction全局事务开关默认false。false为开启,true为关闭
client.tm.degradeCheck降级开关默认false。业务侧根据连续错误数自动降级不走seata事务(详细介绍请阅读附录6)
client.tm.degradeCheckAllowTimes升降级达标阈值默认10
client.tm.degradeCheckPeriod服务自检周期默认2000,单位ms.每2秒进行一次服务自检,来决定
client.rm.reportSuccessEnable是否上报一阶段成功true、false,从1.1.0版本开始,默认false.true用于保持分支事务生命周期记录完整,false可提高不少性能
client.rm.asyncCommitBufferLimit异步提交缓存队列长度默认10000。 二阶段提交成功,RM异步清理undo队列
client.rm.lock.retryInterval校验或占用全局锁重试间隔默认10,单位毫秒
client.rm.lock.retryTimes校验或占用全局锁重试次数默认30
client.rm.lock.retryPolicyBranchRollbackOnConflict分支事务与其它全局回滚事务冲突时锁策略默认true,优先释放本地锁让回滚成功
client.rm.reportRetryCount一阶段结果上报TC重试次数默认5次1.4.1版本新增
client.rm.tableMetaCheckEnable自动刷新缓存中的表结构默认false1.5.1版本新增
client.rm.tableMetaCheckerInterval定时刷新缓存中表结构间隔时间默认60秒
client.rm.sagaBranchRegisterEnable是否开启saga分支注册Saga模式中分支状态存储在状态机本地数据库中,可通过状态机进行提交或回滚,为提高性能可考虑不用向TC注册Saga分支,但需考虑状态机的可用性,默认false
client.rm.sagaJsonParsersaga模式中数据序列化方式默认fastjson,可选jackson1.5.1版本新增
client.rm.tccActionInterceptorOrdertcc拦截器顺序默认Ordered.HIGHEST_PRECEDENCE + 1000,保证拦截器在本地事务拦截器之前执行,也可自定义tcc和业务开发的拦截器执行顺序1.5.1版本新增
client.tm.commitRetryCount一阶段全局提交结果上报TC重试次数默认1次,建议大于1
client.tm.rollbackRetryCount一阶段全局回滚结果上报TC重试次数默认1次,建议大于1
client.tm.defaultGlobalTransactionTimeout全局事务超时时间默认60秒,TM检测到分支事务超时或TC检测到TM未做二阶段上报超时后,发起对分支事务的回滚1.4.0版本新增
client.tm.interceptorOrderTM全局事务拦截器顺序默认Ordered.HIGHEST_PRECEDENCE + 1000,保证拦截器在本地事务拦截器之前执行,也可自定义全局事务和业务开发的拦截器执行顺序1.5.1版本新增
client.undo.dataValidation二阶段回滚镜像校验默认true开启,false关闭
client.undo.logSerializationundo序列化方式默认jackson
client.undo.logTable自定义undo表名默认undo_log
client.undo.onlyCareUpdateColumns只生成被更新列的镜像默认true
client.undo.compress.enableundo log压缩开关默认true1.4.1版本新增
client.undo.compress.typeundo log压缩算法默认zip,可选NONE(不压缩)、GZIP、ZIP、SEVENZ、BZIP2、LZ4、DEFLATER、ZSTD1.4.1版本新增
client.undo.compress.thresholdundo log压缩阈值默认值64k,压缩开关开启且undo log大小超过阈值时才进行压缩1.4.1版本新增
client.rm.sqlParserTypesql解析类型默认druid,可选antlr

参数同步到配置中心使用demo

附录1:

事务分组说明。
1.事务分组是什么?
事务分组是seata的资源逻辑,类似于服务实例。在file.conf中的my_test_tx_group就是一个事务分组。
2.通过事务分组如何找到后端集群?
首先程序中配置了事务分组(GlobalTransactionScanner 构造方法的txServiceGroup参数),程序会通过用户配置的配置中心去寻找service.vgroupMapping
.事务分组配置项,取得配置项的值就是TC集群的名称。拿到集群名称程序通过一定的前后缀+集群名称去构造服务名,各配置中心的服务名实现不同。拿到服务名去相应的注册中心去拉取相应服务名的服务列表,获得后端真实的TC服务列表。
3.为什么这么设计,不直接取服务名?
这里多了一层获取事务分组到映射集群的配置。这样设计后,事务分组可以作为资源的逻辑隔离单位,当发生故障时可以快速failover。

附录2:

关于grouplist问题说明下。
1. 什么时候会用到file.conf中的default.grouplist?
当registry.type=file时会用到,其他时候不读。
2. default.grouplist的值列表是否可以配置多个?
可以配置多个,配置多个意味着集群,但当store.mode=file时,会报错。原因是在file存储模式下未提供本地文件的同步,所以需要使用store.mode=db,通过db来共享TC集群间数据
3. 是否推荐使用default.grouplist?
不推荐,如问题1,当registry.type=file时会用到,也就是说这里用的不是真正的注册中心,不具体服务的健康检查机制当tc不可用时无法自动剔除列表,推荐使用nacos 、eureka、redis、zk、consul、etcd3、sofa。registry.type=file或config.type=file 设计的初衷是让用户再不依赖第三方注册中心或配置中心的前提下,通过直连的方式,快速验证seata服务。    
4.seata-spring-boot-starter中的配置为什么是grouplist.default,也就是说和file.conf中的default.grouplist写法刚好颠倒了位置?  
由于spring-boot本身配置文件语法的要求,这个地方需要将file.conf中的default.grouplist写成grouplist.default,效果是一样的.

附录3:

log_status=1的是防御性的,是收到全局回滚请求,但是不确定某个事务分支的本地事务是否已经执行完成了,这时事先插入一条branchid相同的数据,插入的假数据成功了,本地事务继续执行就会报唯一索引冲突自动回滚。
假如插入不成功说明表里有数据这个本地事务已经执行完成了,那么取出这条undolog数据做反向回滚操作。

附录4:

是否开启spring-boot自动装配,如果开启,则会自动配置seata与spring-boot的集成,包括数据源的自动代理以及GlobalTransactionScanner初始化。
注:1.0版本新特性,需依赖seata-spring-boot-starter。

附录5:

seata1.1.0版本新加入以下注解,用于开启数据源自动代理功能
@EnableAutoDataSourceProxy

attributedescremark
useJdkProxy是否使用JDK代理作为数据源自动代理的实现方式false、true,默认false,采用CGLIB作为数据源自动代理的实现方式
1.对于使用seata-spring-boot-starter的方式,默认已开启数据源自动代理,如需关闭,请配置seata.enableAutoDataSourceProxy=false,该项配置默认为true。
  如需切换代理实现方式,请通过seata.useJdkProxy=false进行配置,默认为false,采用CGLIB作为数据源自动代理的实现方式。
2.对于使用seata-all的方式,请使用@EnableAutoDataSourceProxy来显式开启数据源自动代理功能。如有需要,可通过该注解的useJdkProxy属性进行代理实现方式
  的切换。默认为false,采用CGLIB作为数据源自动代理的实现方式。

附录6:

关于服务自动降级策略的具体实现介绍:
首先通过读取client.tm.degradeCheck是否为true,决定是否开启自检线程.随后读取degradeCheckAllowTimes和degradeCheckPeriod,确认阈值与自检周期.
假设degradeCheckAllowTimes=10,degradeCheckPeriod=2000
那么每2秒钟会进行一个begin,commit的测试,如果失败,则记录连续失败数,如果成功则清空连续失败数.连续错误由用户接口及自检线程进行累计,直到连续失败次数达到用户的阈值,则关闭Seata分布式事务,避免用户自身业务长时间不可用.
反之,假如当前分布式事务关闭,那么自检线程继续按照2秒一次的自检,直到连续成功数达到用户设置的阈值,那么Seata分布式事务将恢复使用

附录7:

在store.mode=db,由于seata是通过jdbc的executeBatch来批量插入全局锁的,根据MySQL官网的说明,连接参数中的rewriteBatchedStatements为true时,在执行executeBatch,并且操作类型为insert时,jdbc驱动会把对应的SQL优化成`insert into () values (), ()`的形式来提升批量插入的性能。
根据实际的测试,该参数设置为true后,对应的批量插入性能为原来的10倍多,因此在数据源为MySQL时,建议把该参数设置为true。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值