当前位置:   article > 正文

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)(二)_java集成seata

java集成seata

一. Seata Server配置Nacos

  • 什么是配置中心?配置中心可以说是一个"大货仓",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息.
  • Seata的配置中心与Spring cloud的配置中心区别是?在广义上来说,并无区别,只不过Spring cloud的配置中心仅是作用于它们自身的组件,而Seata的配置中心也是一样是作用于Seata自身.(注:Spring cloud的配置中心与Seata无关)
  • Seata支持哪些配置中心?
    1. nacos
    2. consul
    3. apollo
    4. etcd
    5. zookeeper
    6. file (读本地文件, 包含conf、properties、yml配置文件的支持)

配置nacos打开下载好的文件夹找到配置文件

 

  1. config:
  2. # support: nacos, consul, apollo, zk, etcd3
  3. # type: file
  4. type: nacos
  5. nacos:
  6. server-addr: 127.0.0.1:8848
  7. namespace: train
  8. group: SEATA_GROUP
  9. username: nacos
  10. password: nacos
  11. context-path:
  12. ##if use MSE Nacos with auth, mutex with username/password attribute
  13. #access-key:
  14. #secret-key:
  15. data-id: seataServer.properties

 配置中心的文件名就是data-id

接下来修改注册中心

 启动项目模块打开seata服务出现注册中心,接下来打开nacos查看命名空间,nacos的配置在前面的博客当中有可以查看怎么集成。

访问nacos,显示的信息都是前面配置成功的信息

 注意这里的id需要和配置文件中的一致, group也需要一致

 下面的配置内容为

  1. # 和微服务模块的seata.tx-service-group保持一致
  2. service.vgroupMapping.train-group=default
  3. service.default.grouplist=127.0.0.1:8091
  4. # 和微服务模块的seata.tx-service-group保持一致
  5. service.vgroupMapping.test-group=default1
  6. service.default1.grouplist=127.0.0.1:18091

AT模式会有一个全局锁,用于防止脏读,线程1的事务修改了库存,但还没提交事务,线程2读库存的时候,读的还是原来的库存

然后下面就是连接数据库nacos所要执行的,官方提供的MySQL数据表存全局id,分布式锁的表

  1. -- -------------------------------- The script used when storeMode is 'db' --------------------------------
  2. -- the table to store GlobalSession data
  3. CREATE TABLE IF NOT EXISTS `global_table`
  4. (
  5. `xid` VARCHAR(128) NOT NULL,
  6. `transaction_id` BIGINT,
  7. `status` TINYINT NOT NULL,
  8. `application_id` VARCHAR(32),
  9. `transaction_service_group` VARCHAR(32),
  10. `transaction_name` VARCHAR(128),
  11. `timeout` INT,
  12. `begin_time` BIGINT,
  13. `application_data` VARCHAR(2000),
  14. `gmt_create` DATETIME,
  15. `gmt_modified` DATETIME,
  16. PRIMARY KEY (`xid`),
  17. KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
  18. KEY `idx_transaction_id` (`transaction_id`)
  19. ) ENGINE = InnoDB
  20. DEFAULT CHARSET = utf8mb4;
  21. -- the table to store BranchSession data
  22. CREATE TABLE IF NOT EXISTS `branch_table`
  23. (
  24. `branch_id` BIGINT NOT NULL,
  25. `xid` VARCHAR(128) NOT NULL,
  26. `transaction_id` BIGINT,
  27. `resource_group_id` VARCHAR(32),
  28. `resource_id` VARCHAR(256),
  29. `branch_type` VARCHAR(8),
  30. `status` TINYINT,
  31. `client_id` VARCHAR(64),
  32. `application_data` VARCHAR(2000),
  33. `gmt_create` DATETIME(6),
  34. `gmt_modified` DATETIME(6),
  35. PRIMARY KEY (`branch_id`),
  36. KEY `idx_xid` (`xid`)
  37. ) ENGINE = InnoDB
  38. DEFAULT CHARSET = utf8mb4;
  39. -- the table to store lock data
  40. CREATE TABLE IF NOT EXISTS `lock_table`
  41. (
  42. `row_key` VARCHAR(128) NOT NULL,
  43. `xid` VARCHAR(128),
  44. `transaction_id` BIGINT,
  45. `branch_id` BIGINT NOT NULL,
  46. `resource_id` VARCHAR(256),
  47. `table_name` VARCHAR(32),
  48. `pk` VARCHAR(36),
  49. `status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
  50. `gmt_create` DATETIME,
  51. `gmt_modified` DATETIME,
  52. PRIMARY KEY (`row_key`),
  53. KEY `idx_status` (`status`),
  54. KEY `idx_branch_id` (`branch_id`),
  55. KEY `idx_xid` (`xid`)
  56. ) ENGINE = InnoDB
  57. DEFAULT CHARSET = utf8mb4;
  58. CREATE TABLE IF NOT EXISTS `distributed_lock`
  59. (
  60. `lock_key` CHAR(20) NOT NULL,
  61. `lock_value` VARCHAR(20) NOT NULL,
  62. `expire` BIGINT,
  63. primary key (`lock_key`)
  64. ) ENGINE = InnoDB
  65. DEFAULT CHARSET = utf8mb4;
  66. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
  67. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
  68. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
  69. INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

现在所有的配置都放在nacos了。

二. Seata Client客户端配置nacos

在对应的模块下的配置文件 bootstrap.properties,下面的配置不用多说了

  1. # seata注册中心,要和seata server的application.yml配置保持一致
  2. seata.registry.type=nacos
  3. seata.registry.nacos.application=seata-server
  4. seata.registry.nacos.server-addr=127.0.0.1:8848
  5. seata.registry.nacos.group=SEATA_GROUP
  6. seata.registry.nacos.namespace=train
  7. seata.registry.nacos.username=nacos
  8. seata.registry.nacos.password=nacos
  9. # seata配置中心,要和seata server的application.yml配置保持一致
  10. seata.config.type=nacos
  11. seata.config.nacos.server-addr=127.0.0.1:8848
  12. seata.config.nacos.group=SEATA_GROUP
  13. seata.config.nacos.namespace=train
  14. seata.config.nacos.dataId=seataServer.properties
  15. seata.config.nacos.username=nacos
  16. seata.config.nacos.password=nacos

 使得当我们的接口出现错误,seata事务会进行回滚,全局事务会放进前面官方提供的表中, 其他的配置都可以简化

三. Seata和MySQL存储演示

事务回滚逆向生成SQL数据

 当我们把接口的线程延迟10秒后点击执行这个接口,我们会发现两个表里面有数据,在全局id表里面只有一个id,当我们10秒之后再次运行SQL刷新SQL之后就会被清除

 SQL限制官方

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/813874
推荐阅读
相关标签
  

闽ICP备14008679号