SpringCloudAlibaba整合seata-1.4.2实现分布式事务

导读:本篇文章讲解 SpringCloudAlibaba整合seata-1.4.2实现分布式事务,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、部署Seata

《Docker部署seata-1.4.2》

《Linux部署seata-1.4.2》

2、整合使用

2.1 pom

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

注意:
在引入pom需要注意SpringCloudAlibaba的版本,版本对应关系查询,比如:
在这里插入图片描述
如果SpringCloudAlibabaSeata的默认版本不对应时,可以单独引入seata依赖,比如:

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <!--版本较低,因此排除-->
                <exclusion>
                    <artifactId>seata-spring-boot-starter</artifactId>
                    <groupId>io.seata</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--seata starter 采用1.4.2版本-->
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.4.2</version>
        </dependency>

2.2 undo_log建表

在微服务客户端连接的数据库中建立undo_log表,语句如下:

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT(20)   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(11)      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
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

2.3 yaml

seata:
  enabled: true
  application-id: ${spring.application.name}
  # 事务组的名称,对应service.vgroupMapping.default_tx_group=xxx中配置的default_tx_group
  tx-service-group: default_tx_group
  # 配置事务组与集群的对应关系
  service:
    vgroup-mapping:
      # default_tx_group为事务组的名称,default为集群名称(与registry.conf中的一致)
      default_tx_group: default
    disable-global-transaction: false
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 112.15.114.18:8848
      group: SEATA_GROUP
      namespace: 64ed9ca7-d705-4655-b4e4-f824e420a12a
      username: nacos
      password: nacos
      # registry.conf中,配置cluster名称
      cluster: default
  config:
    type: nacos
    nacos:
      server-addr: 112.15.114.18:8848
      group: SEATA_GROUP
      namespace: 64ed9ca7-d705-4655-b4e4-f824e420a12a
      username: nacos
      password: nacos
      # nacos配置中心配置的dataId
      data-id: seataServer.properties

2.4 测试使用

全局事务注解:

@GlobalTransactional

在事务发起的微服务方法上加上注解@GlobalTransactional表示全局事务中的一个TM。
注意:异常不能被捕获需要抛出,事务才会发起回滚

比如:

@RestController
@RequestMapping("test")
public class TestController {

    @GetMapping("/insert")
    @GlobalTransactional
    public void selectUserWageByUserId() {
		......
		......
		// 如果RootContext.getXID()不为空,则表示seata生效
		System.out.println("RootContext.getXID():" + RootContext.getXID());
    }
}

效果:
可以看到在undo_log以及seata服务global_tablebranch_tablelock_table中存在seata执行分布式事务时的数据。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、数据源支持及事务级别

隔离级别:
Seata的隔离级别默认为读未提交

数据源支持情况如下:

  • AT模式支持的数据库有:MySQL、Oracle、PostgreSQL、 TiDB、MariaDB。
  • TCC模式不依赖数据源(1.4.2版本及之前),1.4.2版本之后增加了TCC防悬挂措施,需要数据源支持。
  • Saga模式不依赖数据源。
  • XA模式只支持实现了XA协议的数据库。Seata支持MySQL、Oracle、PostgreSQL和MariaDB。

参考:https://seata.io/zh-cn/docs/user/datasource.html

4、SQL支持

4.1 SQL限制

Seata 事务目前支持 INSERT、UPDATE、DELETE 三类 DML 语法的部分功能,这些类型都是已经经过Seata开源社区的验证。

使用限制:

  • 不支持 SQL 嵌套
  • 不支持多表复杂 SQL
  • 不支持存储过程、触发器
  • 不支持批量更新 SQL

参考:https://seata.io/zh-cn/docs/user/sqlreference/sql-restrictions.html

4.2 DML语句

DML 语句类型、SQL 实例以及 Seata 是否支持情况:

类型 SQL 实例 是否支持
INSERT INSERT INTO tb1_name (col_name,...) VALUES ({expr | FAULT},...),(...),...INSERT INTO tb1_name SET col_name={expr | DEFAULT}, ...INSERT INTO tb1_name (col_name,...) VALUES ({expr | FAULT},...) ON DUPLICATE KEY UPDATE field1=value1,...;
UPDATE UPDATE tb1_nameSET col_name1=expr1 [, col_name2=expr2 ...][WHERE where_definition]
DELETE DELETE FROM tb1_name [WHERE where_definition]
SELECT SELECT [ALL | DISTINCT | DISTINCTROW ]select_expr, ... FROM tb1_name[WHERE where_definition]
REPLACE REPLACE [LOW_PRIORITY | DELAYED][INTO] tb1_name [(col_name,...)]VALUES ({expr | DEFAULT},...),(...),...REPLACE [LOW_PRIORITY | DELAYED][INTO] tb1_nameSET col_name={expr | DEFAULT}, ...
TRUNCATE TRUNCATE [TABLE] tb1_name

参考:https://seata.io/zh-cn/docs/user/sqlreference/dml.html

4.3 SQL修饰

Seata 的隔离级别默认为读未提交,该模式下本文表中的 select 语句的 SQL 修饰用法都是支持的;使用 for update 代理可以让 Seata 达到读已提交,该模式下 select 语句的用法只能部分支持。

DML语句支持

类型 SQL 实例 是否支持
AND & OR UPDATE … WHERE col_name1=expr1 AND col_name2= expr2
LIKE UPDATE ... WHERE col_name1 LIKE 'NE'
通配符 UPDATE ... WHERE col_name1 LIKE 'NE%'
BETWEEN UPDATE ... WHERE col_name1 BETWEEN expr1 AND expr2
ON DUPLICATE INSERT INTO tb1_name [(col_name,...)]VALUES ({expr | DEFAULT},...),(...),...[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

Select语句支持

类型 SQL 实例 读未提交 读已提交
AND & OR SELECT * FROM tb1_name WHERE col_name1=expr1 AND col_name2= expr2
ORDER BY SELECT col_name1, col_name2 FROM tb1_name ORDER BY col_name1
GROUP BY SELECT col_name1, col_name2 FROM tb1_name GROUP BY col_name1
LIKE SELECT col_name1, col_name2 FROM tb1_name WHERE col_name1 LIKE 'NE'
通配符 SELECT col_name1, col_name2 FROM tb1_name WHERE col_name1 LIKE 'NE%'
EXISTS SELECT col_name1, col_name2 FROM tb1_name WHERE EXISTS (expr1)
IN SELECT col_name1, col_name2 FROM tb1_name WHERE col_name1 IN (expr1, expr2,...)
BETWEEN SELECT col_name1, col_name2 FROM tb1_name WHERE col_name1 BETWEEN expr1 AND expr2
ON DUPLICATE INSERT INTO tb1_name [(col_name,…)]VALUES ({expr | DEFAULT},…),(…),…[ ON DUPLICATE KEY UPDATE col_name=expr, … ]
ALIASES SELECT t1. col_name1, t2.col_name2 FROM tb1_name AS t1, tb2_name AS t2 WHERE t1. col_name=expr AND t2. col_name=expr
TOP SELECT TOP 2 * FROM tb1_name
LIMIT SELECT col_name1, col_name2 FROM tb1_name LIMIT 5
JOININNER JOINLEFT JOINRIGHT JOINFULL JOIN SELECT col_name1, col_name2 FROM tb1_name JOIN tb2_name>ON tb1_name. col_name1= tb2_name. col_name1
UNIONUNION ALLSELECT INTO SELECT col_name1, col_name2 FROM tb1_name UNION SELECT col_name1, col_name2 FROM tb2_name

参考:https://seata.io/zh-cn/docs/user/sqlreference/sql-decoration.html

4.4 SQL函数

表列出了 DQL 语句和 DML 语句对函数的支持情况。需要注意的是,在 DML 语句中使用函数,不能将其作为主键。

DML语句支持

类型 是否支持
CONCAT(string2[,…])
INSTR(string,substring)
LCASE(string2)
LEFT(string2,length)
LENGTH(string)
LOAD_FILE(file_name)
LOCATE(substring,string[,start_position])
LPAD(string2,length,pad)
LTRIM(string2)
REPEAT(string2,count)
REPLACE(str,search_str,replace_str)
RPAD(string2,length,pad)
RTRIM(string2)
STRCMP(string1,string2)
SUBSTRING(str,position[,length])
TRIM([[BOTH|LEADING|TRAILING][padding]FROM]string2)
UCASE(string2)
RIGHT(string2,length)
SPACE(count)
ABS(number2)
BIN(decimal_number)
CEILING(number2)
CONV(number2,from_base,to_base)
FLOOR(number2)
FORMAT(number,decimal_places)
HEX(DecimalNumber)
LEAST(number,number2[,…])
MOD(numerator,denominator)
POWER(number,power)
RAND([seed])
ROUND(number[,decimals])
SIGN(number2)
SQRT(number2)
ADDTIME(date2,time_interval)
CONVERT_TZ(datetime2,fromTZ,toTZ)
CURRENT_DATE()
CURRENT_TIME()
CURRENT_TIMESTAMP()
DATE(datetime)
DATE_ADD(date2,INTERVALd_valued_type)
DATE_FORMAT(datetime,FormatCodes)
DATE_SUB(date2,INTERVALd_valued_type)
DATEDIFF(date1,date2)
DAY(date)
DAYNAME(date)
DAYOFWEEK(date)
DAYOFYEAR(date)
EXTRACT(interval_nameFROMdate)
MAKEDATE(year,day)
MAKETIME(hour,minute,second)
MONTHNAME(date)
NOW()
SEC_TO_TIME(seconds)
STR_TO_DATE(string,format)
TIMEDIFF(datetime1,datetime2)
TIME_TO_SEC(time)
WEEK(date_time[,start_of_week])
YEAR(datetime)
DAYOFMONTH(datetime)
HOUR(datetime)
LAST_DAY(date)
MICROSECOND(datetime)
MONTH(datetime)
MINUTE(datetime)
FIRST()
LAST()
MIN()
MAX()
AVG()
SUM()
COUNT()

DQL语句支持

类型 读未提交 读已提交
CONCAT(string2[,…])
INSTR(string,substring)
LCASE(string2)
LEFT(string2,length)
LENGTH(string)
LOAD_FILE(file_name)
LOCATE(substring,string[,start_position])
LPAD(string2,length,pad)
LTRIM(string2)
REPEAT(string2,count)
REPLACE(str,search_str,replace_str)
RPAD(string2,length,pad)
RTRIM(string2)
STRCMP(string1,string2)
SUBSTRING(str,position[,length])
TRIM([[BOTH|LEADING|TRAILING][padding]FROM]string2)
UCASE(string2)
RIGHT(string2,length)
SPACE(count)
ABS(number2)
BIN(decimal_number)
CEILING(number2)
CONV(number2,from_base,to_base)
FLOOR(number2)
FORMAT(number,decimal_places)
HEX(DecimalNumber)
LEAST(number,number2[,…])
MOD(numerator,denominator)
POWER(number,power)
RAND([seed])
ROUND(number[,decimals])
SIGN(number2)
SQRT(number2)
ADDTIME(date2,time_interval)
CONVERT_TZ(datetime2,fromTZ,toTZ)
CURRENT_DATE()
CURRENT_TIME()
CURRENT_TIMESTAMP()
DATE(datetime)
DATE_ADD(date2,INTERVALd_valued_type)
DATE_FORMAT(datetime,FormatCodes)
DATE_SUB(date2,INTERVALd_valued_type)
DATEDIFF(date1,date2)
DAY(date)
DAYNAME(date)
DAYOFWEEK(date)
DAYOFYEAR(date)
EXTRACT(interval_nameFROMdate)
MAKEDATE(year,day)
MAKETIME(hour,minute,second)
MONTHNAME(date)
NOW()
SEC_TO_TIME(seconds)
STR_TO_DATE(string,format)
TIMEDIFF(datetime1,datetime2)
TIME_TO_SEC(time)
WEEK(date_time[,start_of_week])
YEAR(datetime)
DAYOFMONTH(datetime)
HOUR(datetime)
LAST_DAY(date)
MICROSECOND(datetime)
MONTH(datetime)
MINUTE(datetime)
FIRST()
LAST()
MIN()
MAX()
AVG()
SUM()
COUNT()

参考:https://seata.io/zh-cn/docs/user/sqlreference/function.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/18030.html

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!