seata入门配置

本文档详细介绍了Seata的入门配置步骤,包括从官方下载地址获取Seata,创建Seata数据库并导入必要表,配置数据库连接,使用Nacos作为配置中心,启动Seata服务器,数据库中添加undo_log表,修改YML文件以及数据源代理设置。通过这些步骤,可以成功设置并运行Seata分布式事务框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、下载地址:https://seata.io/zh-cn/blog/download.html

demo地址:https://gitee.com/itCjb/spring-cloud-alibaba-seata-demo

2、在数据库创建seata库,里面有三张表
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
	`xid`                       VARCHAR(128) NOT NULL,
	`transaction_id`            BIGINT,
	`status`                    TINYINT      NOT NULL,
	`application_id`            VARCHAR(32),
	`transaction_service_group` VARCHAR(32),
	`transaction_name`          VARCHAR(128),
	`timeout`                   INT,
	`begin_time`                BIGINT,
	`application_data`          VARCHAR(2000),
	`gmt_create`                DATETIME,
	`gmt_modified`              DATETIME,
	PRIMARY KEY (`xid`),
	KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
	KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
	`branch_id`         BIGINT       NOT NULL,
	`xid`               VARCHAR(128) NOT NULL,
	`transaction_id`    BIGINT,
	`resource_group_id` VARCHAR(32),
	`resource_id`       VARCHAR(256),
	`branch_type`       VARCHAR(8),
	`status`            TINYINT,
	`client_id`         VARCHAR(64),
	`application_data`  VARCHAR(2000),
	`gmt_create`        DATETIME(6),
	`gmt_modified`      DATETIME(6),
	PRIMARY KEY (`branch_id`),
	KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
	`row_key`        VARCHAR(128) NOT NULL,
	`xid`            VARCHAR(96),
	`transaction_id` BIGINT,
	`branch_id`      BIGINT       NOT NULL,
	`resource_id`    VARCHAR(256),
	`table_name`     VARCHAR(32),
	`pk`             VARCHAR(36),
	`gmt_create`     DATETIME,
	`gmt_modified`   DATETIME,
	PRIMARY KEY (`row_key`),
	KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;
3、修改config.txt中数据库的配置

seata源码目录script/config-center下,配置完成后将该文件拷贝到seata-server目录下

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
// 如需自定义事务组把my_test_tx_group改为自己的事务组即可
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
store.mode=file
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
// 数据库配置
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=username
store.db.password=password
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
client.undo.dataValidation=true
client.undo.logSerialization=jackson
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
4、从源码的script/config-center/nacos目录下nacos-config.sh文件拷贝进seata-server,执行nacos-config.sh:sh ./nacos-config.sh -h 127.0.0.1(nacos注册中心地址) -p 8848在nacos生成seata配置文件
5、启动seata:sh ./bin/seata-server.sh -h 127.0.0.1 -p 8091
6、在需要连接的数据库中添加undo_log表,该文件在script/client/at/db目录下
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
	`id`            BIGINT(20)   NOT NULL AUTO_INCREMENT COMMENT 'increment id',
	`branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id',
	`xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id',
	`context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
	`rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
	`log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
	`log_created`   DATETIME     NOT NULL COMMENT 'create datetime',
	`log_modified`  DATETIME     NOT NULL COMMENT 'modify datetime',
	PRIMARY KEY (`id`),
	UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';
7、修改yml
seata:
  enabled: true
  application-id: ${spring.application.name}
 # 如需自定义事务组把my_test_tx_group改为自己的事务组即可
  tx-service-group: my_test_tx_group
  enable-auto-data-source-proxy: false
  client:
	rm:
	  async-commit-buffer-limit: 1000
	  report-retry-count: 5
	  table-meta-check-enable: false
	  report-success-enable: false
	  saga-branch-register-enable: false
	  lock:
		retry-interval: 10
		retry-times: 30
		retry-policy-branch-rollback-on-conflict: true
	tm:
	  degrade-check: false
	  degrade-check-period: 2000
	  degrade-check-allow-times: 10
	  commit-retry-count: 5
	  rollback-retry-count: 5
	undo:
	  data-validation: true
	  log-serialization: jackson
	  log-table: undo_log
	  only-care-update-columns: true
	log:
	  exceptionRate: 100
  service:
  # 1.0.0以前是vgroup_mapping
	vgroupMapping:
   # 如需自定义事务组把my_test_tx_group改为自己的事务组即可
	  my_test_tx_group: default
	grouplist:
	  default: 127.0.0.1:8091
	enable-degrade: false
	disable-global-transaction: false
	config:
	  type: nacos
	  nacos:
		namespace:
		server-addr: 127.0.0.1:8848
		group: SEATA_GROUP
		username: ""
		password: ""
	registry:
	  type: nacos
	  nacos:
		application: seata-server
		server-addr: ${spring.cloud.alibaba.seata.config.nacos.serverAddr}
		group: ${spring.cloud.alibaba.seata.config.nacos.group}
		namespace: ${spring.cloud.alibaba.seata.config.nacos.namespace}
		username: ${spring.cloud.alibaba.seata.config.nacos.username}
		password: ${spring.cloud.alibaba.seata.config.nacos.password}
8、数据源代理

启动类上添加排除自动加载数据源的注解:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

@Configuration
public class DataSourceConfiguration {

 @Bean(name = "sqlSessionFactory")
 public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
  MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();

  // 以下几行如果不加的话,会导致mybatis插件的分页失效
  PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
  List<ISqlParser> sqlParserList = new ArrayList<>();
  sqlParserList.add(new BlockAttackSqlParser());
  paginationInterceptor.setSqlParserList(sqlParserList);
  bean.setPlugins(new Interceptor[] {paginationInterceptor, new OptimisticLockerInterceptor()});
  bean.setDataSource(dataSourceProxy);
  ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

bean.setMapperLocations(resolver.getResources("classpath:com/**/mapper/*Mapper.xml"));
  SqlSessionFactory factory;
  try {
   factory = bean.getObject();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
  return factory;
 }

 @Bean
 public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
  return new SqlSessionTemplate(sqlSessionFactory);
 }

 @Bean
 @ConfigurationProperties(prefix = "spring.datasource")
 public DruidDataSource druidDataSource() {
  return new DruidDataSource();
 }

 @Primary
 @Bean("dataSource")
 public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
  return new DataSourceProxy(druidDataSource);
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值