现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
>
>
> >
> > 提交前,向 TC 注册分支:申请
> > product 表中,主键值等于 1 的记录的 全局锁 。
> >
> >
> >
>
>
>
>
>
> >
> > 本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。
> >
> >
> >
>
>
>
>
>
> >
> > 将本地事务提交的结果上报给 TC。
> >
> >
> >
>
>
>
#### 2.5.2、 二阶段-回滚
>
>
> >
> > 收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
> >
> >
> >
>
>
>
>
>
> >
> > 通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
> >
> >
> >
>
>
>
>
>
> >
> > 数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。
> >
> >
> >
>
>
>
>
>
> >
> > 根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:
> >
> >
> >
>
>
>
update product set name = ‘TXC’ where id = 1;
>
>
> >
> > 提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。
> >
> >
> >
>
>
>
#### 2.5.3、二阶段-提交
>
>
> >
> > 收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
> >
> >
> >
>
>
>
>
>
> >
> > 异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。
> >
> >
> >
>
>
>
## 3、spring cloud 与seata整合

### 3.1、seata配置
下载地址:https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
**解压到D盘**
#### 3.1.1、修改配置文件
##### 3.1.1.1、conf/file.conf 修改成db模式
store {
mode = “db”
publicKey = “”
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
}
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = “druid”
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = “mysql”
driverClassName = “com.mysql.jdbc.Driver”
## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
url = “jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true”
user = “root”
password = “root”
minConn = 5
maxConn = 100
globalTable = “global_table”
branchTable = “branch_table”
lockTable = “lock_table”
queryLimit = 100
maxWait = 5000
}
redis {
## redis mode: single、sentinel
mode = “single”
## single mode property
single {
host = “127.0.0.1”
port = “6379”
}
## sentinel mode property
sentinel {
masterName = “”
## such as “10.28.235.65:26379,10.28.235.65:26380,10.28.235.65:26381”
sentinelHosts = “”
}
password = “”
database = “0”
minConn = 1
maxConn = 10
maxTotal = 100
queryLimit = 100
}
}
##### 3.1.1.2、conf/registry.conf
registry {
type = “nacos”
nacos {
application = “seata-server”
serverAddr = “127.0.0.1:8848”
group = “SEATA_GROUP”
namespace = “1ff3782d-b62d-402f-8bc4-ebcf40254d0a”
cluster = “default”
username = “nacos”
password = “nacos”
}
eureka {
serviceUrl = “http://localhost:8761/eureka”
application = “default”
weight = “1”
}
redis {
serverAddr = “localhost:6379”
db = 0
password = “”
cluster = “default”
timeout = 0
}
zk {
cluster = “default”
serverAddr = “127.0.0.1:2181”
sessionTimeout = 6000
connectTimeout = 2000
username = “”
password = “”
}
consul {
cluster = “default”
serverAddr = “127.0.0.1:8500”
aclToken = “”
}
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 {
type = “file”
nacos {
serverAddr = “127.0.0.1:8848”
namespace = “”
group = “SEATA_GROUP”
username = “nacos”
password = “nacos”
dataId = “seataServer.properties”
}
consul {
serverAddr = “127.0.0.1:8500”
aclToken = “”
}
apollo {
appId = “seata-server”
## apolloConfigService will cover apolloMeta
apolloMeta = “http://192.168.1.204:8801”
apolloConfigService = “http://192.168.1.204:8080”
namespace = “application”
apolloAccesskeySecret = “”
cluster = “seata”
}
zk {
serverAddr = “127.0.0.1:2181”
sessionTimeout = 6000
connectTimeout = 2000
username = “”
password = “”
nodePath = “/seata/seata.properties”
}
etcd3 {
serverAddr = “http://localhost:2379”
}
file {
name = “file.conf”
}
}
**注意:nacos命名空间namespace定义成自己的。**
##### 3.1.1.3、下载config.tex
https://github.com/seata/seata/tree/develop/script/config-center/config.text 保存到seata根目录,文件名config.txt
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
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
transport.serialization=seata
transport.compressor=none
#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
#Transaction rule configuration, only for the client
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=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
#Log rule configuration, for client and server
log.exceptionRate=100
#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=
#If store.mode,store.lock.mode,store.session.mode are not equal to file, you can remove the configuration block.
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
#These configurations are required if the store mode is db. If store.mode,store.lock.mode,store.session.mode are not equal to db, you can remove the configuration block.
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&rewriteBatchedStatements=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
#These configurations are required if the store mode is redis. If store.mode,store.lock.mode,store.session.mode are not equal to redis, you can remove the configuration block.
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
store.redis.sentinel.masterName=
store.redis.sentinel.sentinelHosts=
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
store.redis.password=
store.redis.queryLimit=100
#Transaction rule configuration, only for the server
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
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false
#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
##### 3.1.1.4、下载nacos-config.sh到conf
然后执行命令:sh nacos-config.sh -h localhost -p 8848 -g SEATA\_GROUP -t 1ff3782d-b62d-402f-8bc4-ebcf40254d0a -u nacos -w nacos
把seata配置同步到nacos

#### 3.1.2、导入数据库
创建数据库:create database seata;
然后执行以下的脚本。
https://github.com/seata/seata/blob/2.x/script/server/db/mysql.sql
global\_table: 全局事务表,每当有一个全局事务发起后,就会在该表中记录全局事务的ID
branch\_table: 分支事务表,记录每一个分支事务的 ID,分支事务操作的哪个数据库等信息
lock\_table: 全局锁
#### 3.1.3、启动seata server
D:\seata\seata-server-1.4.2\bin\seata-server.bat
### 3.2、用例
用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:
* 仓储服务:对给定的商品扣除仓储数量。
* 订单服务:根据采购需求创建订单。
* 帐户服务:从用户帐户中扣除余额。

解决方案:

#### 3.2.1、项目配置
##### 3.2.1.1、创建四个服务
order-service(对应order数据库)
account-service(对应account数据库)
storage-service(对应storage数据库)
business-service
##### 3.2.1.2、每个业务数据库增加回滚表
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.2.1.3、执行业务表脚本
USE storage;
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;
USE order;
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;
USE account;
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;
#### 3.2.2、common-service中添加依赖
io.seata seata-spring-boot-starter 1.4.2 com.alibaba.cloud spring-cloud-starter-alibaba-seata 2021.0.4.0
#### 3.2.3、加配置
seata:
enabled: true
enable-auto-data-source-proxy: false
application-id: vforumc-user
tx-service-group: default_tx_group
service:
vgroup-mapping:
default_tx_group: default
disable-global-transaction: false
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: 1ff3782d-b62d-402f-8bc4-ebcf40254d0a
group: SEATA_GROUP
username: nacos
password: nacos
config:
nacos:
server-addr: 127.0.0.1:8848
namespace: 1ff3782d-b62d-402f-8bc4-ebcf40254d0a
group: SEATA_GROUP
username: nacos
password: nacos
#### 3.2.4、定义数据库代理
package com.xxxx.store.account.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class DataSourceConfig {
@Value(“${spring.datasource.url}”)
private String url;
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!