事务四大特性ACID
- A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。
- C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转 100 元,转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出 100 元,李四账户没有增加 100 元这就出现了数 据错误,就没有达到一致性。
- I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务的运行过程的中间状态。通过配置事务隔离级别可以比避免脏读、重复读问题。
- D(Durability):持久性,事务完成之后,该事务对数据的更改会持久到数据库,且不会被回滚。
CAP原则
- 一致性(Consistency):所有节点在同一时间具有相同的数据
- 可用性(Availability) :保证每个请求不管成功或者失败都有响应(某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求)
- 分区容错性(Partition tolerance) 系统中任意信息的丢失或失败不会影响系统的继续运作 (在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用)
BASE理论
- Basically Available(基本可用)
基本可用就是假设系统某个模块出现了不可预知的故障,但其他模块依旧可用。 - Soft State(软状态)
软状态指的是允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时。 - Eventually Consistent(最终一致性)
上面讲到的软状态不可能一直是软状态,必须有时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性,因此所有客户端对系统的数据访问最终都能够获取到最新的值,而这个时间期限取决于网络延时,系统负载,数据复制方案等因素。
seata 分布式事务
seata部署
1.准备注册中心 nacos 存储使用mysql
#mysql参考Mysql安装以及常用命令
#nacos-standalone.env
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
NACOS_AUTH_IDENTITY_KEY=2222
NACOS_AUTH_IDENTITY_VALUE=2xxx
NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
# 启动nacos
docker run -d --name nacos2 --hostname="nacos2" \
--env-file /home/docker/nacos/nacos-standalone.env \
-v /home/docker/nacos/logs/:/home/nacos/logs/ -v /home/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \
-p 8848:8848 -p 9848:9848 --network inet --restart always nacos/nacos-server:v2.4.3
2.准备seata-server 服务端 配置 复制出配置文件 并修改 参考application.example.yml
docker run -d -p 8091:8091 -p 7091:7091 –name seata-serve seataio/seata-server:latest
docker cp seata-serve:/seata-server/resources /User/seata/config
#
server:
port: 7091
spring:
application:
name: seata-server
console:
user:
username: seata
password: seata
logging:
config: classpath:logback-spring.xml
file:
path: /home/logs/seata
seata:
security:
secretKey: 'seata'
tokenValidityInMilliseconds: 1000000
config:
# support: nacos 、 consul 、 apollo 、 zk 、 etcd3
type: nacos
nacos:
server-addr: nacos2:8848
namespace:
group: SEATA_GROUP
data-id: seataServer.properties
registry:
# support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofa
type: nacos
preferred-networks: 30.240.*
nacos:
application: seata-server
server-addr: nacos2:8848
group: SEATA_GROUP
namespace:
cluster: default
server:
service-port: 8091
max-commit-retry-timeout: -1
max-rollback-retry-timeout: -1
rollback-retry-timeout-unlock-enable: false
enableCheckAuth: true
retryDeadThreshold: 130000
xaerNotaRetryTimeout: 60000
recovery:
handle-all-session-period: 1000
undo:
log-save-days: 7
log-delete-period: 86400000
session:
branch-async-queue-size: 5000 #branch async remove queue size
enable-branch-async-remove: false #enable to asynchronous remove branchSession
store:
# support: file 、 db 、 redis
mode: db
session:
mode: db
lock:
mode: db
#db和redis为高可用模式db需要新建的表如下
#https://github.com/apache/incubator-seata/tree/develop/script/server/db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://mysql:3306/seata?rewriteBatchedStatements=true
user: root
password: 123456
min-conn: 5
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 100
max-wait: 5000
metrics:
enabled: false
registry-type: compact
exporter-list: prometheus
exporter-prometheus-port: 9898
transport:
rpc-tc-request-timeout: 30000
enable-tc-server-batch-send-response: false
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
boss-thread-size: 1
3.启动seata-server cluster
docker run -d --rm --name seata-server \
-p 8091:8091 \
-p 7091:7091 \
-v /home/docker/seata/logs:/home/logs/seata/ \
-v /home/docker/seata/config:/seata-server/resources \
--network inet \
seataio/seata-server:1.5.0