seata 使用oracle_Seata的简单使用-程序员宅基地

技术标签: seata 使用oracle  

Seata的简单使用

本文只介绍Seata的简单使用,没有涉及其原理.

1.在本地搭建一个TC服务(事务协调者).

1.1 下载seata的安装包

往下滑滑,找到你想要的版本和格式下载即可.我这里使用的是seata-server-1.1.0.zip,解压即可使用.

1.2 配置

打开解压目录下的conf/registry.conf文件如下

registry {

# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa

# 可以把seata-server理解为一个服务,它需要把自己注册到某个注册中心上去,方便使用seata的服务来找到自己

#在这里就是指定注册中心的类型,由于我们项目用的是eureka,所以这里我选择eureka,即这一堆配置就下面一个eureka生效了

#这里默认的是file,即文件,选了文件就可以不用搭注册中心,直接从文件里读取服务列表

#复制之后一定要改一改

type = "eureka"

nacos {

serverAddr = "localhost"

namespace = ""

cluster = "default"

}

eureka { #"只有我生效啦"

serviceUrl = "http://localhost:10086/eureka" #eureka地址

application = "seata_tc_server"#在eureka里显示的名字

weight = "1"

}

redis {

serverAddr = "localhost:6379"

db = "0"

}

zk {

cluster = "default"

serverAddr = "127.0.0.1:2181"

session.timeout = 6000

connect.timeout = 2000

}

consul {

cluster = "default"

serverAddr = "127.0.0.1:8500"

}

etcd3 {

cluster = "default"

serverAddr = "http://localhost:2379"

}

sofa {

serverAddr = "127.0.0.1:9603"

application = "default"

region = "DEFAULT_ZONE"

datacenter = "DefaultDataCenter"

cluster = "default"

group = "SEATA_GROUP"

addressWaitTime = "3000"

}

file {

name = "file.conf"

}

}

config {

#在这里选择配置中心,这里我们选择file

# file、nacos 、apollo、zk、consul、etcd3

type = "file"

nacos {

serverAddr = "localhost"

namespace = ""

group = "SEATA_GROUP"

}

consul {

serverAddr = "127.0.0.1:8500"

}

apollo {

app.id = "seata-server"

apollo.meta = "http://192.168.1.204:8801"

namespace = "application"

}

zk {

serverAddr = "127.0.0.1:2181"

session.timeout = 6000

connect.timeout = 2000

}

etcd3 {

serverAddr = "http://localhost:2379"

}

file {

#由于选择了file,所以这里生效了

name = "file.conf"

}

}

所以接下来看一下file.conf文件

## transaction log store, only used in seata-server

store {

## store mode: file、db

#选择配置中心的存储模式,由于选择file存到文件里(性能高)会变为二进制流不好观察,所以选择数据库

#复制之后一定要改一改

mode = "db"

## file store property

file {

## store location dir

dir = "sessionStore"

# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions

maxBranchSessionSize = 16384

# globe session size , if exceeded throws exceptions

maxGlobalSessionSize = 512

# file buffer size , if exceeded allocate new buffer

fileWriteBufferCacheSize = 16384

# when recover batch read size

sessionReloadReadSize = 100

# async, sync

flushDiskMode = async

}

## database store property

db {

#选择了数据库必定要做出一些配置,数据库里一定要有这3张表

## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.

datasource = "dbcp"

## mysql/oracle/h2/oceanbase etc.

dbType = "mysql"

driverClassName = "com.mysql.jdbc.Driver"

url = "jdbc:mysql://192.168.206.99:3306/seata"

user = "root"

password = "root"

minConn = 1

maxConn = 10

globalTable = "global_table"

branchTable = "branch_table"

lockTable = "lock_table"

queryLimit = 100

}

}

建表SQL如下:

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=InnoDBDEFAULT 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,

`gmt_modified`DATETIME,PRIMARY KEY(`branch_id`),KEY`idx_xid` (`xid`)

) ENGINE=InnoDBDEFAULT 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=InnoDBDEFAULT CHARSET = utf8;

1.3 启动

如果是linux环境(要有JRE),执行seata-server.sh

如果是windows环境,执行seata-server.bat

2 改造微服务

只要是需要用到seata(分布式事务)的服务,都要做类似的配置.

2.1 引入依赖

我这里是springboot项目,所以我先在父pom中声明了.如下

2.1.0.RELEASE

1.1.0

com.alibaba.cloud

spring-cloud-alibaba-seata

${alibaba.seata.version}

seata-all

io.seata

seata-all

io.seata

${seata.version}

接下来只要在需要seata的微服务里添加依赖就好了.

com.alibaba.cloud

spring-cloud-alibaba-seata

io.seata

seata-all

2.2 添加配置

spring:

cloud:

alibaba:

seata:

tx-service-group: test_tx_group # 定义事务组的名称

2.3 在resources目录下添加2个文件file.conf和registry.conf

registry.conf和前面的一样,直接复制过来就好.

file.conf里的内容不同了,新的内容如下:

transport {

# tcp udt unix-domain-socket

type = "TCP"

#NIO NATIVE

server = "NIO"

#enable heartbeat

heartbeat = true

# the client batch send request enable

enableClientBatchSendRequest = true

#thread factory for netty

threadFactory {

bossThreadPrefix = "NettyBoss"

workerThreadPrefix = "NettyServerNIOWorker"

serverExecutorThread-prefix = "NettyServerBizHandler"

shareBossWorker = false

clientSelectorThreadPrefix = "NettyClientSelector"

clientSelectorThreadSize = 1

clientWorkerThreadPrefix = "NettyClientWorkerThread"

# netty boss thread size,will not be used for UDT

bossThreadSize = 1

#auto default pin or 8

workerThreadSize = "default"

}

shutdown {

# when destroy server, wait seconds

wait = 3

}

serialization = "seata"

compressor = "none"

}

service {

#这里注意,等号前后都是配置,前面是yml里配置的事务组,后面是register.conf里定义的seata-server

vgroupMapping.test_tx_group = "seata_tc_server"

#only support when registry.type=file, please don't set multiple addresses

seata_tc_server.grouplist = "127.0.0.1:8091"

#degrade, current not support

enableDegrade = false

#disable seata

disableGlobalTransaction = false

}

client {

rm {

asyncCommitBufferLimit = 10000

lock {

retryInterval = 10

retryTimes = 30

retryPolicyBranchRollbackOnConflict = true

}

reportRetryCount = 5

tableMetaCheckEnable = false

reportSuccessEnable = false

}

tm {

commitRetryCount = 5

rollbackRetryCount = 5

}

undo {

dataValidation = true

logSerialization = "jackson"

logTable = "undo_log"

}

log {

exceptionRate = 100

}

}

配置解读:

transport:与TC交互的一些配置

heartbeat:client和server通信心跳检测开关

enableClientBatchSendRequest:客户端事务消息请求是否批量合并发送

service:TC的地址配置,用于获取TC的地址

vgroupMapping.test_tx_group = "seata_tc_server":

test_tx_group:是事务组名称,要与application.yml中配置一致,

seata_tc_server:是TC服务端集群的名称,将来通过注册中心获取TC地址

enableDegrade:服务降级开关,默认关闭。如果开启,当业务重试多次失败后会放弃全局事务

disableGlobalTransaction:全局事务开关,默认false。false为开启,true为关闭

default.grouplist:这个当注册中心为file的时候,才用到

client:客户端配置

rm:资源管理器配

asynCommitBufferLimit:二阶段提交默认是异步执行,这里指定异步队列的大小

lock:全局锁配置

retryInterval:校验或占用全局锁重试间隔,默认10,单位毫秒

retryTimes:校验或占用全局锁重试次数,默认30次

retryPolicyBranchRollbackOnConflict:分支事务与其它全局回滚事务冲突时锁策略,默认true,优先释放本地锁让回滚成功

reportRetryCount:一阶段结果上报TC失败后重试次数,默认5次

tm:事务管理器配置

commitRetryCount:一阶段全局提交结果上报TC重试次数,默认1

rollbackRetryCount:一阶段全局回滚结果上报TC重试次数,默认1

undo:undo_log的配置

dataValidation:是否开启二阶段回滚镜像校验,默认true

logSerialization:undo序列化方式,默认Jackson

logTable:自定义undo表名,默认是undo_log

log:日志配置

exceptionRate:出现回滚异常时的日志记录频率,默认100,百分之一概率。回滚失败基本是脏数据,无需输出堆栈占用硬盘空间

2.4 代理DataSource

由于在一阶段是通过拦截sql分析语义来生成回滚策略,原来的数据源已经不够用了,得换个牛逼的.在服务里新建一个配置类.

如果是使用的是mybatis

importio.seata.rm.datasource.DataSourceProxy;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;

@Configurationpublic classDataSourceProxyConfig {

@Beanpublic SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throwsException {//因为使用的是mybatis,这里定义SqlSessionFactoryBean

SqlSessionFactoryBean sqlSessionFactoryBean = newSqlSessionFactoryBean();//配置数据源代理

sqlSessionFactoryBean.setDataSource(newDataSourceProxy(dataSource));returnsqlSessionFactoryBean.getObject();

}

}

如果使用的是mybatis-plus

importcom.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;importio.seata.rm.datasource.DataSourceProxy;importorg.apache.ibatis.session.SqlSessionFactory;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;

@Configurationpublic classDataSourceProxyConfig {

@Beanpublic SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throwsException {//订单服务中引入了mybatis-plus,所以要使用特殊的SqlSessionFactoryBean

MybatisSqlSessionFactoryBean sqlSessionFactoryBean = newMybatisSqlSessionFactoryBean();//代理数据源

sqlSessionFactoryBean.setDataSource(newDataSourceProxy(dataSource));//生成SqlSessionFactory

returnsqlSessionFactoryBean.getObject();

}

}

2.5 加上注解

给事务发起者的方法上加上@GlobalTransactional即可,其它的参与者只要加@Transactional就好了.

3.踩坑记录

1.由于更换了数据源,不知道为什么我在yml里给mybatis配置的驼峰映射失效了,导致我查到的数据缺少了某些字段.不知道这个问题在mybatis-plus中会不会出现.

解决办法:单独给数据源配置映射规则就好了.所以我把上面的配置类加了一个设置,修改后的代码如下.

importio.seata.rm.datasource.DataSourceProxy;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;

@Configurationpublic classDataSourceProxyConfig {

@Beanpublic SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throwsException {//因为使用的是mybatis,这里定义SqlSessionFactoryBean

SqlSessionFactoryBean sqlSessionFactoryBean = newSqlSessionFactoryBean();//配置数据源代理

sqlSessionFactoryBean.setDataSource(newDataSourceProxy(dataSource));

SqlSessionFactory object=sqlSessionFactoryBean.getObject();assert object != null;

// 单独给数据源设置驼峰映射

object.getConfiguration().setMapUnderscoreToCamelCase(true);returnobject;

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39688750/article/details/111530485

智能推荐

Nodejs下载文件文件名中文乱码问题解决方案-程序员宅基地

为什么80%的码农都做不了架构师?>>> ..._nodejs 下载附件 文件名不能为中文

经纬财富:荆门金价是否继续走强-程序员宅基地

近两月频繁的紧张的地区局势,造就了一波近百点的黄金行情,从操作角度来说,这种情况是比较难把握的,如果说基本面还有迹可循的话,那地区局势需要靠投资者们的丰富的想象力才能判断,判断对的概率也是相对较小,即使判断对,什么时候会发生,这又是一个很难预测的问题。本周后半周各国制造业PMI数据将陆续公布,投资者应密切关注。  数据预告:北京时间周四(7月24日)各国7月制造业PMI将陆续出炉,届时数据将体

MP4文件格式解析,获取指定的Box信息_android解析mp4box-程序员宅基地

之前的一个项目中需要根据设备生成的视频中保存的信息,与手机视频做一些视频融合处理,因此,需要对MP4文件进行解析获取其中保存的信息。mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。box的基本结构是:其中,size指明了整个box所占用的大小,包括header部分。如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数..._android解析mp4box

vue-cli3 移除生产环境console.log打印的日志-程序员宅基地

前言:后台模版使用的开源的基于elementUI的nx-admin,为了项目的安全性,需要在生产环境上面去除控制台打印的日志。使用该框架尝试两种插件terser-webpack-plugin和babel-plugin-transform-remove-console。网上很多都是第一种,我尝试了未成功,可能设置的方法有问题,第二种方法设置成功。下面只描述成功的方法1.安装依赖...

经纬财富:张家口现货白银的行情-程序员宅基地

众所周知,商品的价格高低是由供求关系来决定的,供大于求价格下跌,供不应求则价格上涨。然而,黄金白银作为国际金融资产与硬通货,其供求因素只是决定黄金白银价格的次要因素,黄金白银市场的主导因素是金融因素,即大国经济政策、大国经济数据以及美元走势,另外国际投行的态度,黄金ETF等大型机构占主导因素,个人认为金银价的弱市局面并没有得到彻底改善和释放,总体而言,2014年的宏观环境依然利空贵金属,当然也存在

员工离职2个月,前领导要求他回去改代码,员工:收费5千一次_改代码怎么报价合适-程序员宅基地

在职场上,如果一个员工离职了,那么与前公司应该没什么关系了。即使你在前公司所负责的工作出现问题,也与你无关,公司更没有权力要求你回去帮忙。而程序员这个工作由于其特殊性,有时候一些问题会在员工离职后很久才会出现,这时候如果公司要求你回去帮忙修改代码,你会不会帮忙呢?最近在职场论坛上看到这样一个帖子:员工离职60天,前领导要求他回去修改代码,员工:收费5千一次,不给钱谁去呢?这到底是怎么回事呢?..._改代码怎么报价合适

随便推点

Vivado使用误区与进阶——XDC约束技巧之I/O篇 (下)-程序员宅基地

作者:周丽娜(Ally Zhou ),Xilinx工具与方法学应用专家 《XDC约束技巧之时钟篇》中曾对I/O约束做过简要概括,相比较而言,XDC中的I/O约束虽然形式简单,但整体思路和约束方法却与UCF大相径庭。加之FPGA的应用特性决定了其在接口上有多种构建和实现方式,所以从UCF到XDC的转换过程中,最具挑战的可以说便是本文将要讨论的I/O约束了。 继《XDC约束技巧之I/O...

"Deep Depth Completion of a Single RGB-D Image"论文阅读记录以及quicktest_normal estimation occlusion boundary-程序员宅基地

(一)论文简要说明这是一篇2018年CVPR的最新论文,可以直接通过输入RGB图以及相对应的Depth图,然后可以直接补全任意形式深度图的缺失。 (二)论文仔细品读1、摘要2、..._normal estimation occlusion boundary

将应用程序发布到IIS上_iis发布application-程序员宅基地

将应用程序发布到IIS上参考链接:https://www.cnblogs.com/shuai7boy/p/5651780.html遇到的问题用户 ‘NT AUTHORITY\SYSTEM’ 登录失败解决措施:https://www.cnblogs.com/skyboy110/p/7260308.html拒绝了对对象’aspnet_CheckSchemaVersion’的 EXECUTE ..._iis发布application

InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema-程序员宅基地

在上一篇《InnoDB 层系统字典表|全方位认识 information_schema》中,我们详细介绍了InnoDB层的系统字典表,本期我们将为大家带来系列第六篇《InnoDB 层锁、...

在Mac 电脑上使用虚拟机 VirtualBox 安装 Windows 11 问题:当前电脑不满足安装Windows 11 的条件要求...-程序员宅基地

一直使用Mac OS,最近忽然想体验一下最新版本的Windows 11. 于是,去官网下载了Windows 11的安装映像文件,准备在VirtualBox上安装一台Win11的虚拟机。由于之前我已经成功安装过该系统,因此并没有想到安装过程会出现什么问题。但是进行了两次安装尝试之后,我发现安装进程一直提示我——当前电脑不满足安装Windows 11 的条件要求,这令我异常迷惑。无奈只得到微软官网查找..._mac virtualbox 启动虚拟机后无法安装操作系统

谈谈Python中列表、元组和数组的区别和操作-程序员宅基地

今天给大家讲讲Python中列表List、元组Tuple、数组Array的区别和操作总结,话不多说,马上开始。01列表(List)1.列表的特点列表是以方括号“[]”包围的数据集合,不同..._元组和数组