分布式事务

  1. 事务四大特性ACID
  2. CAP原则
  3. BASE理论
  4. seata 分布式事务
    1. seata部署
    2. Seata 模式
      1. XA模式
      2. AT模式
      3. TCC模式
      4. saga模式
    3. seata示例

事务四大特性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

Seata 模式

XA模式
AT模式
TCC模式
saga模式

seata示例