Apache Seata快速入门

前置推荐阅读:Apache Seata 简介-CSDN博客

快速开始

让我们从一个微服务示例开始。

用例​

用户购买商品的业务逻辑。整个业务逻辑由 3 个微服务提供支持:

  • 仓储服务:对给定的商品扣除仓储数量。
  • 订单服务:根据采购需求创建订单。
  • 帐户服务:从用户帐户中扣除余额。

架构图​

Architecture

仓储服务​

public interface StorageService {/*** 扣除存储数量*/void deduct(String commodityCode, int count);
}

订单服务​

public interface OrderService {/*** 创建订单*/Order create(String userId, String commodityCode, int orderCount);
}

帐户服务​

public interface AccountService {/*** 从用户账户中借出*/void debit(String userId, int money);
}

主要业务逻辑​

public class BusinessServiceImpl implements BusinessService {private StorageService storageService;private OrderService orderService;/*** 采购*/public void purchase(String userId, String commodityCode, int orderCount) {storageService.deduct(commodityCode, orderCount);orderService.create(userId, commodityCode, orderCount);}
}

public class OrderServiceImpl implements OrderService {private OrderDAO orderDAO;private AccountService accountService;public Order create(String userId, String commodityCode, int orderCount) {int orderMoney = calculate(commodityCode, orderCount);accountService.debit(userId, orderMoney);Order order = new Order();order.userId = userId;order.commodityCode = commodityCode;order.count = orderCount;order.money = orderMoney;// INSERT INTO orders ...return orderDAO.insert(order);}
}

SEATA 的分布式交易解决方案​

 我们只需要使用一个 @GlobalTransactional 注解在业务方法上:

    @GlobalTransactionalpublic void purchase(String userId, String commodityCode, int orderCount) {......}

由 Dubbo + SEATA 提供支持的示例​

步骤 1:建立数据库​

  • 要求:具有 InnoDB 引擎的 MySQL。

注意: 实际上,在示例用例中,这 3 个服务应该有 3 个数据库。 但是,为了简单起见,我们只创建一个数据库并配置 3 个数据源。

使用您刚创建的数据库 URL/username/password 修改 Spring XML。

dubbo-account-service.xml dubbo-order-service.xml dubbo-storage-service.xml

        <property name="url" value="jdbc:mysql://x.x.x.x:3306/xxx" /><property name="username" value="xxx" /><property name="password" value="xxx" />

步骤 2:创建 UNDO_LOG 表​

SEATA AT 模式需要 UNDO_LOG 表

-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`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,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

步骤 3:为示例业务创建表​

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT 0,PRIMARY KEY (`id`),UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT 0,`money` int(11) DEFAULT 0,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`money` int(11) DEFAULT 0,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤 4: 启动服务​

  • 从 https://github.com/apache/incubator-seata/releases,下载服务器软件包,将其解压缩。
Usage: sh seata-server.sh(for linux and mac) or cmd seata-server.bat(for windows) [options]Options:--host, -hThe address is expose to registration center and other service can access seata-server via this ipDefault: 0.0.0.0--port, -pThe port to listen.Default: 8091--storeMode, -mlog store mode : file、dbDefault: file--helpe.g.sh seata-server.sh -p 8091 -h 127.0.0.1 -m file

步骤 5: 运行示例​

示例仓库: seata-samples/at-samples。找到合适的依赖项设置,按顺序启动 AccountStorageOrderBusiness 服务。

seata 参数配置

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

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
#store.mode=raft 需要以下配置
server.raft.group
server.raft.server-addr
server.raft.snapshot-interval

全属性​

公共部分​

keydescremarkchange record
transport.typesocket 通信方式TCP、UNIX_DOMAIN_SOCKET,默认 TCP
transport.serversocket 通道类型NIO、NATIVE(根据操作系统类型和 socket 通信方式选择 KQueue 或 Epoll,注意 Windows 只支持 NIO,选择这种方式会抛出异常)
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、hessian、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 开启
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
transport.enableTcServerBatchSendResponseTC 批量发送回复消息开关默认 false1.5.1 版本新增,建议为 true,可解决 client 批量消息时的线头阻塞问题
transport.rpcRmRequestTimeoutRM 二阶段下发请求超时时间默认 15 秒
transport.rpcTmRequestTimeoutTM 二阶段下发请求超时时间默认 30 秒
transport.rpcTcRequestTimeoutTC 二阶段下发请求超时时间默认 15 秒1.5.1 版本新增
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对于批量请求消息的并行处理开关默认 true1.5.2 版本新增
server.enableParallelHandleBranch二阶段并行下发开关默认 false2.0.0 版本新增
server.applicationDataLimitCheck是否开启应用数据大小检查默认 false
server.applicationDataLimit应用数据大小限制默认 64000
server.raft.groupraft 存储模式下的 group,client 的事务分组对应的值要与之对应,如 service.vgroup-mapping.default_tx_group=defaultdefault2.0.0 版本新增
server.raft.server-addrraft 集群列表如 192.168.0.111:9091,192.168.0.112:9091,192.168.0.113:90912.0.0 版本新增
server.raft.snapshot-interval间隔多久做一次内存快照,每做一次快照将暂停状态机,但是能提高停机恢复速度默认 600 秒2.0.0 版本新增
server.raft.apply-batch任务累积批次后提交至 leader默认 322.0.0 版本新增
server.raft.max-append-bufferSizeraft 日志存储缓冲区最大大小默认 256K2.0.0 版本新增
server.raft.max-replicator-inflight-msgs在启用 pipeline 请求情况下,最大 in-flight 请求数默认 2562.0.0 版本新增
server.raft.disruptor-buffer-size内部 disruptor buffer 大小,如果是写入吞吐量较高场景,需要适当调高该值,默认 163842.0.0 版本新增
server.raft.election-timeout-ms超过多久没有 leader 的心跳开始重选举默认 1000 毫秒2.0.0 版本新增
server.raft.reporter-enabledraft 自身的监控是否开启默认 false2.0.0 版本新增
server.raft.reporter-initial-delay监控输出间隔默认 60 秒2.0.0 版本新增
server.raft.serialization序列化方式,目前仅支持 jackson默认 jackson2.0.0 版本新增
server.raft.compressorraftlog 和 snapshot 的压缩方式,支持 gzip, zstd, lz4none2.0.0 版本新增
server.raft.syncraftlog 同步刷盘true2.0.0 版本新增
store.mode事务会话信息存储方式file 本地文件(不支持 HA),db 数据库、redis、raft 支持 HA1.5.1 版本改用 lock 和 session 分离存储,2.0.0 开始支持 raft 模式
store.lock.mode事务锁信息存储方式file 本地文件(不支持 HA),db 数据库,redis(支持 HA);配置为空时,取 store.mode 配置项值,raft 模式不允许指定1.5.1 版本新增,session 和 lock 可分离存储
store.session.mode事务回话信息存储方式file 本地文件(不支持 HA),db 数据库,redis(支持 HA);配置为空时,取 store.mode 配置项值。raft 模式不允许单独指定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
store.redis.typeredis 模式主要使用的方式: lua, pipplinepippline
metrics.enabled是否启用 Metrics默认 true 开启,在 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 单条发送
transport.enableTmClientChannelCheckFailFast客户端 TM 快速失败检查默认 true,false 不检测
transport.enableRmClientChannelCheckFailFast客户端 RM 快速失败检查默认 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.rm.applicationDataLimitCheck客户端应用数据是否开启限制默认 false
client.rm.applicationDataLimit客户端应用数据上报限制默认 64000
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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】解答:为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

gitlab配置ssh密钥

1.配置用户信息 git config --global user.name "你的名字" git config --global user.email "你的邮箱" 查看配置是否成功 git config --global --list 2.生成密钥 终端 或 右键文件夹open git bash here 输入命令 ssh-keygen -t rsa -C 随意(生…

接口测试(二)jmeter——实现http请求、察看结果树、请求默认值

一、实现http请求&#xff0c;察看结果树 1. 测试计划 --> 添加 --> 线程(用户) --> 线程组 2. 线程组配置 默认配置 线程数&#xff1a;虚拟用户数&#xff0c;一个虚拟用户占用一个进程或线程。 Ramp-Up 时间&#xff08;秒&#xff09;&#xff1a;全部线程执行完…

使用Jenkins部署项目

部署中的痛点 为什么要用Jenkins&#xff1f;我说下我以前开发的痛点&#xff0c;在一些中小型企业&#xff0c;每次开发一个项目完成后&#xff0c;需要打包部署&#xff0c;可能没有专门的运维人员&#xff0c;只能开发人员去把项目打成一个exe包&#xff0c;可能这个项目已…

Kettle基本使用

目录 一、安装Kelttle 1-1 安装java环境 1-2 Kettle安装 二、Kettle的基本使用 2-1 将txt文本数据转为excel数据 创建txt文件 创建kettle的转换任务 定义转换流程 配置输入文件 连接读取和写入任务 配置excel输出 保存转换任务 执行转换任务 2-2 将txt文件输出到M…

数据库管理-第252期 深入浅出多主多活数据库技术- Cantian存储引擎(二)(20241017)

数据库管理252期 2024-10-17 数据库管理-第252期 深入浅出多主多活数据库技术- Cantian存储引擎&#xff08;二&#xff09;&#xff08;20241017&#xff09;1 部署规划2 服务器基础配置2.1 配置HOSTS2.2 关闭防火墙2.3 关闭SELinux2.4 配置yum源 3 编译服务器配置3.1 安装git…

「Python精品教程」Python快速入门,基础数据结构:数字

​***奕澄羽邦精品教程系列*** 编程环境&#xff1a; 1、Python 3.12.5 2、Visual Studio Code 1.92.1 在现实世界中&#xff0c;我们经常要面对各式各样的数字&#xff0c;通过简单或者复杂的数学运算&#xff0c;来帮助我们计算出想要的结果。程序开发过程中&#xff0c;数字…

自动化测试工具在API测试中的优势是什么?

在设计API接口时&#xff0c;确保数据获取的效率和准确性是至关重要的。以下是一些最佳实践和代码示例&#xff0c;帮助你提高API的数据获取效率和准确性。 1. 使用高效的数据访问模式 选择合适的数据库访问模式对于提高数据获取效率至关重要。例如&#xff0c;使用索引可以显…

【启明智显分享】ZX7981PM WIFI6 5G-CPE:2.5G WAN口,2.4G/5G双频段自动调速

昨天&#xff0c;我们向大家展现了ZX7981PG WIFI6 5G-CPE&#xff0c;它强大的性能也引起了一波关注&#xff0c;与此同时&#xff0c;我们了解到部分用户对更高容量与更高速网口的需求。没关系&#xff01;启明智显早就预料到了&#xff01;ZX7981PM满足你的需求&#xff01; …

Vue3 集成Monaco Editor编辑器

Vue3 集成Monaco Editor编辑器 1. 安装依赖2. 使用3. 效果 Monaco Editor &#xff08;官方链接 https://microsoft.github.io/monaco-editor/&#xff09;是一个由微软开发的功能强大的在线代码编辑器&#xff0c;被广泛应用于各种 Web 开发场景中。以下是对 Monaco Editor 的…

HTML5教程(三)- 常用标签

1 文本标签-h 标题标签&#xff08;head&#xff09;&#xff1a; 自带加粗效果&#xff0c;从h1到h6字体大小逐级递减一个标题独占一行 语法 <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5…

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多&#xff0c;大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时&#xff0c;PHP会按照以下步骤执行&#xff1a; 确定数据类型&#xff1a;检查参与比较的两…

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果&#xff0c;发现遇到中文时出现乱码&#xff0c;导致无法正常进行响应断言&#xff0c;很影响工作。于是&#xff0c;察看了其他测试人员的解决方案&#xff0c;发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…

【文化课学习笔记】【化学】选必三:同分异构体的书写

【化学】选必三&#xff1a;同分异构体的书写 如果你是从 B 站一化儿笔记区来的&#xff0c;请先阅读我在第一篇有机化学笔记中的「读前须知」(点开头的黑色小三角展开)&#xff1a;链接 链状烃的取代和插空法 取代法 一取代物 甲烷、乙烷、丙烷、丁烷的种类 甲烷&#xff1a;只…

游戏逆向基础-找释放技能CALL

思路&#xff1a;通过send断点然后对send的data参数下写入断点找到游戏里面的技能或者攻击call 进入游戏先选好一个怪物&#xff08;之所以要先选好是因为选怪也会断&#xff0c;如果直接左键打怪的话就会断几次&#xff09; 断下来后对参数下硬件写入断点 硬件断点断下来后先…

如何用pyhton修改1000+图片的名字?

import os oldpath input("请输入文件路径&#xff08;在windows中复制那个图片文件夹的路径就可以):") #注意window系统中的路径用这个‘\分割&#xff0c;但是编程语言中一般都是正斜杠也就是’/‘ #这里写一个代码&#xff0c;将 \ > / path "" fo…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

基于FPGA的DDS信号发生器(图文并茂+深度原理解析)

篇幅有限,本文详细源文件已打包 至个人主页资源,需要自取...... 前言 DDS(直接数字合成)技术是先进的频率合成手段,在数字信号处理与硬件实现领域作用关键。它因低成本、低功耗、高分辨率以及快速转换时间等优点备受认可。 本文着重探究基于 FPGA 的简易 DDS 信号发生器设…

交叉熵损失 在PyTorch 中的计算过程

其实就是根据 真实值的结果&#xff0c;当成索引去取的值 import torch import torch.nn as nnaaaa torch.tensor([[2.0,1.0,3.0],[2.0,4.0,2.0]])l1 nn.LogSoftmax(dim-1) result l1(aaaa) print(result) import torch import torch.nn as nn# 定义交叉熵损失函数 criterio…

数据治理为何如此简单?

欢迎来文末免费获取数据治理相关PPT和文档 引言 随着大数据技术的迅速发展&#xff0c;企业积累的数据量呈现爆炸式增长。有效的数据管理已经成为企业提高决策效率、增强竞争优势的重要手段。在这样的背景下&#xff0c;数据治理逐渐成为企业数据管理中不可或缺的一环。它不仅…