• 首页
  • 邻居
  • 关于
  • 归档
  • 搜索
  • 夜间模式
    ©2020-2026  我的学习笔记 Theme by OneBlog

    我的学习笔记博客

    搜索
    标签
    # 随笔 # Java # 教程 # openwrt # Mysql # SQL # 爬虫 # post # Js调优 # MAVEN
  • 首页>
  • 随笔>
  • 正文
  • seata + zookeeper解决分布式事务问题

    2023年04月04日 1.8 k 阅读 0 评论 3966 字

    公司业务需要用到
    springboot+dubbo+zookeeper 做分布式服务
    但是遇到一个两个系统直接项目调用操成数据不同步问题

    所以就开始百度找啊找

    最终选用 seata做分布式事务

    网上大部分都是nanos+seata
    但是我们公司是zookeeper

    所以。。。
    首先在pom引入

    <dependency>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                    <version>1.5.2</version>
    </dependency>

    然后下载seata1.5.2的程序

    在seata\conf
    修改application.yml
    这个文件可以仿照 application.example.yml 文件进行修改

    server:
      port: 7091
    
    spring:
      application:
        name: seata-server
    
    logging:
      config: classpath:logback-spring.xml
      file:
        path: ${user.home}/logs/seata
      extend:
        logstash-appender:
          destination: 127.0.0.1:4560
        kafka-appender:
          bootstrap-servers: 127.0.0.1:9092
          topic: logback_to_logstash
    
    console:
      user:
        username: seata
        password: seata
    
    seata:
      config:
        # support: nacos, consul, apollo, zk, etcd3
        type: zk
        zk:
          server-addr: 127.0.0.1:2181
          session-timeout: 6000
          connect-timeout: 2000
          username:
          password:
          node-path: /seata/seata.properties
      registry:
        # support: nacos, eureka, redis, zk, consul, etcd3, sofa
        type: zk
        zk:
          cluster: default
          server-addr: 127.0.0.1:2181
          session-timeout: 6000
          connect-timeout: 2000
          username: ""
          password: ""
      store:
        # support: file 、 db 、 redis
        mode: db
        db:
          datasource: druid
          db-type: mysql
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
          user: user
          password: password
          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
    #  server:
    #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
      security:
        secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
        tokenValidityInMilliseconds: 1800000
        ignore:
          urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

    然后再项目里面的application.yml
    添加

    #AT 模式
    seata:
      enabled: true
      application-id: kingow-oa-server  ---自己写
      tx-service-group: kingow-oa-server-group ---自己写,这个和下面的service.vgroup-mapping的key要保持一致
      enable-auto-data-source-proxy: true
      client:
        support:
          spring:
            datasource-autoproxy: true
      registry:
        type: zk
        zk:
          server-addr: 127.0.0.1:2181
          connect-timeout: 2000
          session-timeout: 6000
          username: ""
          password: ""
      service:
        grouplist:
          default: 127.0.0.1:8091
        vgroup-mapping:
          kingow-oa-server-group: default  

    seata 要导入它自身的数据库 创建一个数据库导入,然后修改seata的yml文件里面的db链接 seata\script\server\db
    ,然后再业务数据库 自行添加一个表

    CREATE TABLE `undo_log` (
      `branch_id` bigint 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 NOT NULL COMMENT '0:normal status,1:defense status',
      `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
      `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
      UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='AT transaction mode undo table';

    然后如果要使用 就在service层添加注解

    @GlobalTransactional
    

    目录:seata\bin
    linux启动方式:

    ./seata-server.sh -h 127.0.0.1 -p 8091 &

    window直接双击

    seata-server.bat

    如果一闪而过可以在bat文件最后里面添加一行

    pause

    seata启动后有个前端页面:
    http://127.0.0.1:7091/#/
    可以查看全局事务情况
    ,debug模块打断点可以表undo_log里面的数据,回滚成功后就会删除记录

    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    首页邻居关于归档
    Copyright©2020-2026  All Rights Reserved.  Load:0.016 s
    京ICP备18019712号
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。