《springcloud alibaba》 四 seata安装以及使用

目录

  • 准备
  • 调整db配置
    • 准备创建数据库
  • seata配置nacos
    • 配置confi.txt
    • 下载向nacos推送配置的脚本
  • 启动seata
  • 新建项目
  • order-seata项目 订单项目
    • 数据库脚本
    • pom.xml
    • application.yml
    • 启动类
    • 实体类
    • dao类
    • service类
    • controller类
    • feign类
    • mapper类
  • stock-seata 库存项目
    • 数据库脚本
    • pom.xml
    • application.yml
    • 启动类
    • 实体类
    • dao类
    • service类
    • controller类
    • mapper类
  • 测试
  • 特殊情况
  • 分布式事务
    • order-seata项目变动
      • pom.xml
      • application.yml
      • controller
    • stock-seata项目变动
      • pom.xml
      • application.yml
    • 脚本
    • 效果
  • 分布式事务原理
    • nacos配置问题
    • seata的几个表都是什么情况

准备

名称版本
Nacos1.4.5
seata1.4.0
alibabacloud2.2.5.RELEASE
  • 本博客版本

seata官网地址
seata安装包下载
在这里插入图片描述

  • 没有linux服务器,可本地搭建玩一下
  • 注意alibaba版本跟seata版本一定要严格控制,不然会出现一些奇奇怪怪的问题

默认数据存储分为2钟,一种是存在bin目录下的root.data文件里面,还有一种是db方式,本文使用db模式

调整db配置

  • 注意mysql数据库的版本得5.7以上。-
  • 修改配置文件之前,别慌,先copy一遍再说,养成好习惯
    在这里插入图片描述
  • 调整模式为db, 修改db对应的配置

准备创建数据库

在这里插入图片描述
mysql脚本下载地址
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 先把整个项目下载,然后到这个目录下,找到mysql.sql

seata配置nacos

在这里插入图片描述

  • 先备份一下配置文件
    在这里插入图片描述
  • 删除其他没有用的配置,调整一下配置

配置confi.txt

到之前下载好的依赖包中copy对应的config.txt文件,放到seata目录下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 修改存储类型
    在这里插入图片描述
  • 调整为自己对应的url地址,以及账号和密码

下载向nacos推送配置的脚本

在这里插入图片描述

  • 将该脚本移动到seata的conf配置下
    在这里插入图片描述
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t seata -u nacos -w nacos
# h: nacos服务ip.
# p: nacos服务端口号.
# g: 想要的分组信息.
# t: 第一步新建的命名空间.
# u: nacos登录名.
# w: nacos登录密码

如果是本地没有做任务的修改,直接运行就行
在这里插入图片描述

  • 大概运行5分钟左右
    在这里插入图片描述
  • 很奇葩的设计,搞不懂为什么不单独弄一个文件来存储所有的内容,而是key value的方式,看起来很乱,建议单独创建一个seata的命令空间用来存储这些配置

启动seata

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

  • window启动用bat文件
    在这里插入图片描述
  • 可以看出默认端口为8091,也可以自定义
    在这里插入图片描述
  • 在服务列表中,就可以看到多了一个seata-server的服务
  • 因为window版本,不好演示集群方式,所以我这里的集群数量是1

新建项目

在这里插入图片描述
在之前的基础上新增一个seata项目
在这里插入图片描述

  • 注意,新增后,该项目是没有蓝点的
    在这里插入图片描述

  • 添加+号,解决蓝点问题
    在这里插入图片描述

  • 自己手动补一下seata这个目录

  • 创建模块order-seata和stock-seata

order-seata项目 订单项目

在这里插入图片描述

  • 新增这两个项目

在这里插入图片描述

  • 库存项目的结构

数据库脚本

create database seata_order;
use seata_order;CREATE TABLE `order_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`product_id` varchar(200) DEFAULT NULL,`total_amount` decimal(10,3) DEFAULT NULL,`statu` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
  • 新增数据库

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.lcs.springcloud</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>order-nacos</artifactId><packaging>jar</packaging><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-netflix-ribbon</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies><build><finalName>order</finalName></build>
</project>

application.yml

server:port: 8190spring:application:name: order-seatacloud:nacos:discovery:namespace: publicserver-addr: localhost:8848username: nacospassword: nacosdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:db-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.10.108:3306/seata_order?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useCursorFetch=trueusername: rootpassword: 12312312
mybatis:mapper-locations: classpath:mapper/*.xml

启动类

package com.lcs.springcloud;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@MapperScan("com.lcs.springcloud.dao")
@EnableFeignClients
public class OrderSeataApplication {public static void main(String[] args) {SpringApplication.run(OrderSeataApplication.class);}
}

实体类

package com.lcs.springcloud.entity;import java.math.BigDecimal;public class OrderTbl {private Integer id;private String product_id;private BigDecimal total_amount;private Integer statu;public OrderTbl() {}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProduct_id() {return product_id;}public void setProduct_id(String product_id) {this.product_id = product_id;}public BigDecimal getTotal_amount() {return total_amount;}public void setTotal_amount(BigDecimal total_amount) {this.total_amount = total_amount;}public Integer getStatu() {return statu;}public void setStatu(Integer statu) {this.statu = statu;}@Overridepublic String toString() {return "OrderTbl{" +"id=" + id +", product_id='" + product_id + '\'' +", total_amount=" + total_amount +", statu=" + statu +'}';}
}

dao类

package com.lcs.springcloud.dao;import com.lcs.springcloud.entity.OrderTbl;
import org.springframework.stereotype.Repository;@Repository
public interface OrderDao {void insert(OrderTbl orderTbl);
}

service类

package com.lcs.springcloud.service;import com.lcs.springcloud.dao.OrderDao;
import com.lcs.springcloud.entity.OrderTbl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {@AutowiredOrderDao orderDao;public void insert(OrderTbl orderTbl) {orderDao.insert(orderTbl);}
}

controller类

package com.lcs.springcloud.controller;import com.lcs.springcloud.entity.OrderTbl;
import com.lcs.springcloud.feign.StockOpenFeign;
import com.lcs.springcloud.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;@RestController
@RequestMapping("/order")
public class OrderController {@AutowiredOrderService orderService;@AutowiredStockOpenFeign stockOpenFeign;@RequestMapping("/add")public String add(){OrderTbl orderTbl = new OrderTbl();orderTbl.setProduct_id("10");orderTbl.setTotal_amount(new BigDecimal(3000));orderTbl.setStatu(0);orderService.insert(orderTbl);String reduct = stockOpenFeign.reduct(orderTbl.getProduct_id());return "add order "+reduct;}
}

feign类

package com.lcs.springcloud.controller;import com.lcs.springcloud.entity.OrderTbl;
import com.lcs.springcloud.feign.StockOpenFeign;
import com.lcs.springcloud.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;@RestController
@RequestMapping("/order")
public class OrderController {@AutowiredOrderService orderService;@AutowiredStockOpenFeign stockOpenFeign;@RequestMapping("/add")public String add(){OrderTbl orderTbl = new OrderTbl();orderTbl.setProduct_id("10");orderTbl.setTotal_amount(new BigDecimal(3000));orderTbl.setStatu(0);orderService.insert(orderTbl);String reduct = stockOpenFeign.reduct(orderTbl.getProduct_id());return "add order "+reduct;}
}

mapper类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lcs.springcloud.dao.OrderDao"><!-- 主键自增长的插入 --><insert id="insert" parameterType="com.lcs.springcloud.entity.OrderTbl" useGeneratedKeys="true" keyProperty="id">insert into order_tbl(product_id,total_amount,statu) values(#{product_id},#{total_amount},#{statu});</insert>
</mapper>

stock-seata 库存项目

在这里插入图片描述

数据库脚本

 create database seata_stock;
use seata_stock;CREATE TABLE `stock_tbl` (`id` int(11) NOT NULL AUTO_INCREMENT,`product_id` varchar(200) DEFAULT NULL,`count` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8INSERT INTO `seata_stock`.`stock_tbl` (`id`, `product_id`, `count`) VALUES (1, '10', 100);

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.lcs.springcloud</groupId><artifactId>springcloudalibaba</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>stock-seata</artifactId><packaging>jar</packaging><dependencies><!-- Nacos服务注册发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--继承了父项目,不需要添加版本号--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.3.5.RELEASE</version></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version><!-- 排除冲突的jar包文件--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></exclusion></exclusions></dependency><!--Mysql驱动器--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version><scope>runtime</scope></dependency><!-- druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency></dependencies><build><finalName>order-seata</finalName></build>
</project>

application.yml

server:port: 8200spring:application:name: stock-seatacloud:nacos:discovery:namespace: publicserver-addr: localhost:8848username: nacospassword: nacosdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:db-type: mysqldriver-class-name: com.mysql.jdbc.Driver#url: jdbc:mysql://10.153.96.31:3306/iomm-collection?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useCursorFetch=trueurl: jdbc:mysql://112.74.51.171:3306/seata_stock?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useCursorFetch=trueusername: rootpassword: Zy_746498
mybatis:mapper-locations: classpath:mapper/*.xml

启动类

package com.lcs.springcloud;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.lcs.springcloud.dao")
public class StockSeataApplication {public static void main(String[] args) {SpringApplication.run(StockSeataApplication.class,args);}
}

实体类

package com.lcs.springcloud.entity;public class StockTbl {private Integer id;private String product_id;private Integer count;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProduct_id() {return product_id;}public void setProduct_id(String product_id) {this.product_id = product_id;}public Integer getCount() {return count;}public void setCount(Integer count) {this.count = count;}
}

dao类

package com.lcs.springcloud.dao;import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;@Repository
public interface StockDao {void updateStock(@Param("product_id")String product_id);
}

service类

package com.lcs.springcloud.service;import com.lcs.springcloud.dao.StockDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class StockService {@AutowiredStockDao stockDao;public String updateStock(String product_id) {try {stockDao.updateStock(product_id);return "扣减库存成功";}catch (Exception e){return "更新库存失败";}}
}

controller类

package com.lcs.springcloud.controller;import com.lcs.springcloud.service.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/stock")
public class StockController {@AutowiredStockService stockService;@Value("${server.port}")String port;@RequestMapping("/reduct")public String reduct(@RequestParam(value = "product_id") String product_id){return stockService.updateStock(product_id);}}

mapper类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lcs.springcloud.dao.StockDao"><!-- 主键自增长的插入 --><update id="updateStock"  parameterType="java.lang.String" >update stock_tbl  SET count= count-1 where product_id=#{product_id}</update>
</mapper>

测试

前提: 保持已经开启nacos,不知道的可以先学习一下nacos
在这里插入图片描述

  • 订单表 默认为空
    在这里插入图片描述
  • 库存表默认为100个库存

运行http://localhost:8190/order/add
在这里插入图片描述
结果如下:
在这里插入图片描述

在这里插入图片描述

  • 订单表新增一条记录,库存表-1,说明项目搭建成功

特殊情况

已知: order和stock是两个库
把order的controller代码,改一下

package com.lcs.springcloud.controller;import com.lcs.springcloud.entity.OrderTbl;
import com.lcs.springcloud.feign.StockOpenFeign;
import com.lcs.springcloud.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;@RestController
@RequestMapping("/order")
public class OrderController {@AutowiredOrderService orderService;@AutowiredStockOpenFeign stockOpenFeign;@RequestMapping("/add")@Transactionalpublic String add(){OrderTbl orderTbl = new OrderTbl();orderTbl.setProduct_id("10");orderTbl.setTotal_amount(new BigDecimal(3000));orderTbl.setStatu(0);//1. 插入订单orderService.insert(orderTbl);//2. 扣减库存String reduct = stockOpenFeign.reduct(orderTbl.getProduct_id());// 3. 出现问题int a= 1/0;return "add order "+reduct;}
}

在这里插入图片描述

  • 都知道0不能作为分母,必报错, 大家说一下这个接口是多少?
    订单插入进行了回滚,库存表进行扣减库存,为什么?
    这是因为@transaction事物是不支持跨库回滚的。

分布式事务

代码版本在上续上面做改动,请保证上面能先运行后, 再看该步骤

order-seata项目变动

pom.xml

 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2.2.5.RELEASE</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>
  • 为什么加了一个cglib的包?
    在这里插入图片描述
  • 报cg相关的一个错,猜测估计是依赖冲突的问题,查了一下项目依赖,发现只有可能cglib的问题
    在这里插入图片描述

application.yml

server:port: 8190spring:application:name: order-seatacloud:nacos:discovery:namespace: publicserver-addr: localhost:8848username: nacospassword: nacosalibaba:seata:tx-service-group: default_tx_groupdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:db-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata_order?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useCursorFetch=trueusername: rootpassword: 123456
mybatis:mapper-locations: classpath:mapper/*.xmlseata:registry:#配置seata的注册中心type: nacosnacos:### nacos服务器地址server-addr: localhost:8848username: nacospassword: nacos### nacos服务名application: seata-serverconfig:type: nacosnacos:### nacos服务器地址server-addr: localhost:8848username: nacospassword: nacosgroup: SEATA_GROUP

在这里插入图片描述

  • 为什么叫这个名字,看自己seata-server的配置
    在这里插入图片描述
    在这里插入图片描述
  • 这里标红的,就是我们需要填写的名字,在网上可以查到很多叫guangzhou的,这是因为别人重命名咯

controller

在这里插入图片描述

  • 注解改为@GlobalTransactional,表示是分布式事务

stock-seata项目变动

pom.xml

 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2.2.5.RELEASE</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version></dependency>

application.yml

server:port: 8200spring:application:name: stock-seatacloud:nacos:discovery:namespace: publicserver-addr: localhost:8848username: nacospassword: nacosalibaba:seata:tx-service-group: default_tx_groupdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:db-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata_stock?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useCursorFetch=trueusername: rootpassword: 123456
mybatis:mapper-locations: classpath:mapper/*.xmlseata:registry:#配置seata的注册中心type: nacosnacos:### nacos服务器地址server-addr: localhost:8848username: nacospassword: nacos### nacos服务名application: seata-serverconfig:type: nacosnacos:### nacos服务器地址server-addr: localhost:8848username: nacospassword: nacosgroup: SEATA_GROUP
  • 跟order项目类似,就是client跟seata以及nacos进行通信

脚本

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

在这里插入图片描述

  • 涉及到分布式事务的库,都需要新增该undo-log得表,他会记录修改前,以及修改后的sql,以便逆向回滚
  • 例如你执行了新增,逆向就是删除

效果

在这里插入图片描述

  • order表
    在这里插入图片描述
  • 库存表

在这里插入图片描述
执行http://localhost:8190/order/add,查看数据库,出现异常后

  • 之前使用@transation是,订单回滚,库存减咯
  • 选择使用@globaTransation注解,订单回滚,库存不变

分布式事务原理

nacos配置问题

在这里插入图片描述
启动后,在bin下面多了一个store开头的文件夹,why?
我不是改成db模式吗?为什么配置没有生效,查了半天,才发现nacos的配置,竟然是默认的
在这里插入图片描述

  • 搜索store.mode*改成db

启动项目后,竟然报数据库的一个错误,怎么可能,我数据库的配置,都是copy的项目里面,不可能出问题,那原因只有一个,就是nacos里面的初始化配置又有问题
在这里插入图片描述

  • 修改nacos这三个的配置,再启动项目,seata得bin下面,没有文件夹生成,说明切换成db模式成功

seata的几个表都是什么情况

在这里插入图片描述

  • seata的表

在这里插入图片描述

  • 这是seata的一个流程图
    在这里插入图片描述
  • 输入http://localhost:8190/order/add,在进入方法的时候打入断点
    在这里插入图片描述
    在这里插入图片描述
  • global_table表生成了一个xid 拼接方式是ip+端口再加一个唯一id
  • xid 全局事务id
  • application_id 应用id
  • transaction_service_group 分组
  • transaction_name 事物加在那个方法上面(以前有个版本会标注在具体类具体方法),新版本后,变动了,好奇他底层是什么映射的,知道的,可以下方交流一下
    在这里插入图片描述
  • 断点执行到这里
    在这里插入图片描述
  • branch_table 表新增了一条数据,这个是分支Xid
    在这里插入图片描述
  • 订单库的undo-log,也新增了一条数据
    在这里插入图片描述
  • lock_table表变化会存储锁表的信息
  • pk就是主键的id
#到order库调用该sql,查看blob存放的内容
select CONVERT(t.rollback_info USING utf8) from undo_log t
  • 如下图
    在这里插入图片描述
  • 因为是插入语句,所以beforeImage之前是没有数据的,afterImage存放的就是修改后的数据

断点走完后,所有的seata表数据都会回滚,如果遇到异常退出的情况,请先清空表数据

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302062.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第⑫讲:Ceph集群OSD扩缩容中Reblanceing数据的重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

AAC相关知识

一、AAC音频格式种类有哪些 AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIF&#xff08;Audio Data Interchange Format音频数据交换格式&#xff09;和ADTS&#xff08;Audio Data transport Stream音频数据传输流&#xff09;。 ADIF 特点…

RFID工业读写器步骤:只需4步,即可安装使用!

高频读写器在安装的时候需要先考察清楚安装环境&#xff0c;然后根据环境要求选定读写器&#xff0c;确定好对应的安装方式&#xff0c;以及安装位置。具体操作通常包括以下几个步骤&#xff1a; 1、了解安装环境 在安装之前&#xff0c;需要了解实际应用环境&#xff0c;根据环…

鸿蒙南向开发:制作【智能儿童手表】

样例简介 本项目是基于BearPi套件开发的智能儿童手表系统&#xff0c;该系统通过与GSM模块&#xff08;型号&#xff1a;SIM808&#xff09;的通信来实现通话和定位功能。 智能儿童手表系统可以通过云和手机建立连接&#xff0c;同步时间和获取天气信息&#xff0c;通过手机下…

智慧农场物联网系统:重塑农业的未来

随着科技的进步&#xff0c;物联网技术正在逐渐改变我们的生活。在农业领域&#xff0c;物联网系统也正在发挥着越来越重要的作用&#xff0c;为智慧农场的发展提供了新的可能。本文将深入探讨智慧农场物联网系统的优势、应用场景、技术实现以及未来发展趋势。 一、智慧农场物…

npm包安装与管理:深入解析命令行工具的全方位操作指南,涵盖脚本执行与包发布流程

npm&#xff0c;全称为Node Package Manager&#xff0c;是专为JavaScript生态系统设计的软件包管理系统&#xff0c;尤其与Node.js平台紧密关联。作为Node.js的默认包管理工具&#xff0c;npm为开发者提供了便捷的方式来安装、共享、分发和管理代码模块。 npm作为JavaScript世…

CKA 基础操作教程(五)

Kubernetes Ingress 理论学习 Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。 Ingress 资源示例&#xff1a; apiVersion: networking.k8s.io/v1 # 指定 Kubernetes 中使用的 API 版本 kind: Ingress # 指定对象…

[dvwa] CSRF

CSRF 0x01 low 跨站&#xff0c;输入密码和确认密码直接写在url中&#xff0c;将连接分享给目标&#xff0c;点击后修改密码 社工方式让目标点击短链接 伪造404页&#xff0c;在图片中写路径为payload&#xff0c;目标载入网页自动请求构造链接&#xff0c;目标被攻击 http…

吴恩达深度学习笔记:深层神经网络(Deep Neural Networks)4.5-4.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第四周&#xff1a;深层神经网络(Deep Neural Networks)4.5 为什么使用深层表示&#xff1f;&#xff08;Why deep representations?&#xff09; 第一门课&#xff1a;神经网络和深度学习 (…

设计模式之观察者模式讲解

概念&#xff1a;定义对象间一种一对多的依赖关系&#xff0c;使得当每一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新。 抽象主题&#xff1a;或者叫被观察者&#xff0c;可以持有、增加、删除观察者对象。具体主题&#xff1a;实现抽象主题定义的…

一部手机游全国|打造文旅云平台,开启智慧旅游新篇章

随着移动互联网的迅猛发展&#xff0c;旅游业在不断寻求创新与变革&#xff0c;旅游小程序作为智慧文旅的一个终端&#xff0c;在智慧推荐、智慧票务、智慧导览、智慧服务、虚拟体验等方面上&#xff0c;都具备发展潜力。小程序的出现&#xff0c;则从根本上大大提升了景区智慧…

如何快速开启一个项目-ApiHug - API design Copilot

ApiHug101-001开启篇 &#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin |…

数据库——实验6 视图的创建与使用

1. 视图的定义 视图是根据需要以一个表或多个表为基础&#xff0c;选择满足一定条件的行或列数据的静态定义。它是一种逻辑对象&#xff0c;是一种虚拟表。视图并不生成行或列的永久副本&#xff0c;并不占用存储空 间&#xff0c;也就是说&#xff0c;视图就是保存在数据库中…

探索算力(云计算、人工智能、边缘计算等):数字时代的引擎

引言 在数字时代&#xff0c;算力是一种至关重要的资源&#xff0c;它是推动科技创新、驱动经济发展的关键引擎之一。简而言之&#xff0c;算力即计算能力&#xff0c;是计算机系统在单位时间内完成的计算任务数量或计算复杂度的度量。随着科技的不断发展和应用范围的不断扩大…

nginx到底是怎么工作的

工作流程 用户通过域名发出访问Web服务器的请求&#xff0c;该域名被DNS服务器解析为反向代理服务器的IP地址反向代理服务器接受用户的请求反向代理服务器在本地缓存中查找请求的内容&#xff0c;找到后直接把内容发送给用户如果本地缓存里没有用户所请求的信息内容&#xff0…

工地安全监测识别摄像机

工地安全监测识别摄像机是一种在建筑工地和施工现场广泛使用的智能监控设备&#xff0c;主要用于监测施工过程中可能出现的安全隐患和违规行为&#xff0c;以确保工地人员和设备的安全。通过高清摄像头、智能算法和远程监控系统的结合&#xff0c;该摄像机可以实时监测工地各个…

功能测试_验证qq账号的合法性

案例&#xff1a;验证qq账号的合法性&#xff08;要求&#xff1a;6-10位的自然数&#xff09; 使用等价类设计用例案例&#xff1a; 步骤&#xff1a; 1:明确需求&#xff1a;qq账号的合法性 2:划分等价类&#xff1a;有效等价类、有效取值、无效等价类、无效取值 3&…

LeetCode第十五题:三数之和【15/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

rabbitmq的介绍和交换机类型

rabbitmq的介绍和交换机类型 1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系…

k8s存储卷 PV与PVC 理论学习

介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API&#xff0c;将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点&#xff0c;我们引入了两个新的 API 资源&#xff1a;PersistentVolume 和 Persistent…