从安装 Seata 开始的分布式事务之旅 springboot集成seata

从安装 Seata 开始的分布式事务之旅

  • 介绍
    • 什么是 Seata?
  • 安装 Seata Server
    • 下载 Seata Server 发行版
    • 配置Seata
      • 解压文件
      • 配置Seata的yml文件
      • 把配置文件config.txt加载到nacos上
        • 修改config.txt文件
        • 加载到nacos上
    • 启动Seata服务
      • 正常启动
        • 查看启动日志
        • 打开控制台页面
      • 启动时遇到的坑
        • 无法解析${console.user.username}的值
        • 无法解析${seata.security.secretKey}的值
        • 数据库连接问题
  • 在 Spring Boot 项目中集成 Seata
    • 工作环境
    • cloud、boot、alibaba环境
    • 添加依赖
    • 配置yml
    • 业务代码中集成 Seata
      • 使用 `@GlobalTransactional` 注解管理全局事务
      • 演示 AT(自动补偿)模式和 TCC(两阶段提交)模式
        • 使用 AT(自动补偿)模式
        • 使用 TCC(两阶段提交)模式
    • 集成Seata踩的坑
      • Table 'ddz.undo_log' doesn't exist
      • no available service 'null' found, please make sure registry config correct
      • 分布式事务未生效
      • dynamic-datasource can not find primary datasource
      • Communications link failure
  • 总结
  • 参考资料

在这里插入图片描述

介绍

什么是 Seata?

在现代应用程序开发中,分布式系统的应用越来越广泛。然而,随着系统的复杂性增加,处理分布式事务变得愈发困难。这就是 Seata 出现的背景。Seata(Simple Extensible Autonomous Transaction Architecture)是一种开源的分布式事务解决方案,旨在解决分布式系统中的事务一致性和协调性问题。
在传统的单体应用中,通常使用关系型数据库来管理事务,保证数据的一致性。但在分布式系统中,由于涉及多个独立的服务,事务管理变得复杂。分布式事务的要求是:所有涉及的服务要么都成功提交,要么都回滚,以保持数据的一致性。

Seata 提供了两种主要的事务模式:

  1. AT 模式(自动补偿模式):在 AT 模式中,Seata会自动补偿事务,无需手动编写补偿逻辑。Seata会将事务的所有操作编排成一个全局的事务,然后执行各个分支的 try 操作,在出现异常时执行相应的补偿操作。

  2. TCC 模式(两阶段提交模式):TCC 模式要求开发者手动编写 Try、Confirm 和 Cancel 三个阶段的逻辑。在 TCC 模式中,Seata负责协调全局事务的提交和回滚,而各个分支的 try、confirm 和 cancel 操作则由开发者来实现。

Seata 还提供了可扩展的注册中心和存储支持,使其适用于各种不同的场景。

总的来说,Seata 是一个强大的分布式事务解决方案,可以帮助开发者解决分布式事务的难题,确保分布式系统中数据的一致性和可靠性。通过集成 Seata,开发者可以更加轻松地构建复杂的分布式应用,提升系统的稳定性和性能。

安装 Seata Server

下载 Seata Server 发行版

您可以从 Seata 官方网站下载最新的 Seata Server 发行版,并解压到指定目录;有源码和二进制版本,我们这里选择安装二进制文件下载。我的版本是1.7.0 (2023-07-11,推荐版本)
在这里插入图片描述

配置Seata

解压文件

在这里插入图片描述
下载下来的是zip文件,解压后是上面文件夹,默认文件夹名字是seata。

配置Seata的yml文件

进入seata/conf目录下,这里有两个配置文件; 我们需要把application.yml 随意修改一个名字;然后再 application.example.yml修改成application.yml 作为主要配置文件。
在这里插入图片描述
修改 application.yml文件,我这里使用的nacos作为注册中心,所以需要修改的地方有:

  1. seata:config:type
  2. seata:registry:type
  3. store:mode
  4. store:session:mode
  5. store: lock:mode
  6. store:db 数据库的配置修改成自己的

配置文件:

server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstash
# 这里是主要的配置文件
seata:config:# support: nacos 、 consul 、 apollo 、 zk  、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848# 如果在nacos上添加了命名空间,则配置命令空间IDnamespace:# 配置分组group: SEATA_GROUPusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos 、 eureka 、 redis 、 zk  、 consul 、 etcd3 、 sofatype: nacospreferred-networks: 30.240.*nacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:server:service-port: 8091 #If not configured, the default is '${server.port} + 1000'max-commit-retry-timeout: -1max-rollback-retry-timeout: -1rollback-retry-timeout-unlock-enable: falseenable-check-auth: trueenable-parallel-request-handle: trueretry-dead-threshold: 130000xaer-nota-retry-timeout: 60000enableParallelRequestHandle: truerecovery:committing-retry-period: 1000async-committing-retry-period: 1000rollbacking-retry-period: 1000timeout-retry-period: 1000undo:log-save-days: 7log-delete-period: 86400000session:branch-async-queue-size: 5000 #branch async remove queue sizeenable-branch-async-remove: false #enable to asynchronous remove branchSessionstore:# support: file 、 db 、 redismode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=trueuser: mysqlpassword: mysqlmin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000metrics:enabled: falseregistry-type: compactexporter-list: prometheusexporter-prometheus-port: 9898transport:rpc-tc-request-timeout: 15000enable-tc-server-batch-send-response: falseshutdown:wait: 3thread-factory:boss-thread-prefix: NettyBossworker-thread-prefix: NettyServerNIOWorkerboss-thread-size: 1

把配置文件config.txt加载到nacos上

修改config.txt文件

config.txt文件在seata/script/config-center目录下;我们需要修改的地方有:

  1. store.mode=db
  2. store.lock.mode=db
  3. store.session.mode=db
  4. store.db 数据库的配置修改成自己的,和上面yml文件里面的一样

加载到nacos上

进入seata/script/config-center/nacos 目录下执行nacos-config.sh文件。

sh nacos-config.sh -h 121.37.228.169 -p 8848 -g SEATA_GROUP -t 0af6e97b-a684-4647-b696-7c6d42aecce7 -u nacos -w nacos
  • -h: Nacos IP地址
  • -p: Nacos端口号
  • -g: Group分组名
  • -t: 命名空间ID,没有则默认public
  • -u: 用户名
  • -w:密码
    执行完成时候登录我们的Nacos配置管理就能查看到加载好的数据:
    在这里插入图片描述

启动Seata服务

正常启动

进入seata/bin 目录下,执行命令:

sh seata-server.sh 

在这里插入图片描述

这里我启动的时候可以会遇到报异常的情况,下面我出了几种我在启动时遇到的一些坑。可以移步到 启动时遇到的坑

查看启动日志

我的是Mac系统所有是open打开日志文件,其他的系统需要根据系统来执行命令,或者直接进入seata/logs目录下查看start.out文件。

open /Users/ddz/Downloads/seata/logs/start.out

在这里插入图片描述
能看到日志输出地址说明启动成功了。

打开控制台页面

控制台页面,默认账号密码是 seata/seata。
在这里插入图片描述

启动时遇到的坑

这里是我在部署Seata中遇到的一些坑,可能和有不同的地方只做为参考。

无法解析${console.user.username}的值

异常信息: Could not resolve placeholder ‘console.user.username’ in value “${console.user.username}”
在这里插入图片描述
解决方法:需要把之前修改成其他名称的yml文件中console下的所有配置信息复制到现在的application.yml下。这里就是设置我们登录控制台页面的账号密码。

无法解析${seata.security.secretKey}的值

异常信息:Could not resolve placeholder ‘seata.security.secretKey’ in value “${seata.security.secretKey}”
在这里插入图片描述
解决方法:需要把之前修改成其他名称的yml文件中seata.security下的所有配置信息复制到现在的application.yml下。

数据库连接问题

异常信息:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
在MySQL5.7之前的版本,安全性较低,存在任何用户都可以连接上数据库,所以官方在5.7版本加大了对隐私的保护。并且采用了默认 useSSL = true值防止对数据库的随意修改,到了8.0版本,仍然保留了SSL,并且默认值为 true。
在这里插入图片描述

解决方法:在数据库配置url后追加&useSSL=false;需要检查yml配置文件和Nacos上配置列表中store.db.url
在这里插入图片描述

在 Spring Boot 项目中集成 Seata

上面我们介绍了如何在本地安装seata服务端,接下来介绍一下我们Spring Boot项目中集成seata;这里我只单纯的用一个demo来介绍,可根据自己的业务逻辑来进行实现。

工作环境

  • MySQL 5.7.28
  • Maven 3.5.4
  • JDK 1.8
  • Mybatis 3.4.1
  • dynamic 3.4.1

cloud、boot、alibaba环境

   <spring-boot.version>2.3.7.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR9</spring-cloud.version><spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>

添加依赖

	<!--    MySQL    --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--    Mybatis    --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><!--    多数据源    --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.1</version></dependency><!--    Seata分布式事务    --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

配置yml

server:port: 7001
spring:application:name: ddz-usercloud:nacos:discovery:# 服务分组group: ddzserver-addr: 121.37.228.111:8848# 必须填命名空间的ID
#        namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82datasource:dynamic:# 开启seata分布式事务seata: truestrict: falseprimary: masterdatasource:master:url: jdbc:mysql://121.37.228.111:3306/ddz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=trueusername: ddzpassword: ddz2023local:url: jdbc:mysql://127.0.0.1:3306/ddz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=trueusername: rootpassword: ddz2023# MyBatis Plus配置
mybatis-plus:# 搜索指定包别名typeAliasesPackage: com.ddz.**.entity# 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*.xmlglobal-config:db-config:id-type: autoconfiguration:# 开启驼峰,开启后,只要数据库字段和对象属性名字母相同,无论中间加多少下划线都可以识别map-underscore-to-camel-case: true# Seata 配置
seata:application-id: seata-server# 是否启用数据源bean的自动代理enable-auto-data-source-proxy: falsetx-service-group: default_tx_group  # 必须和服务器配置一样registry:type: nacosnacos:# Nacos 服务地址server-addr: 121.37.228.111:8848group: SEATA_GROUP
#      namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82application: seata-server # 必须和服务器配置一样#      username:#      password:cluster: defaultconfig:type: nacosnacos:server-addr: 121.37.228.111:8848group: SEATA_GROUP
#      namespace: 9ebef975-dcc0-4430-9c63-1c62d8a86d82service:vgroup-mapping:default_tx_group: default # 必须和服务器配置一样disable-global-transaction: falseclient:rm:# 是否上报成功状态report-success-enable: true# 重试次数report-retry-count: 5

业务代码中集成 Seata

我们根据两个数据源创建两个mapper类然后再controller中测试;我这里方便测试就省略了业务层。

使用 @GlobalTransactional 注解管理全局事务

在这里插入图片描述

演示 AT(自动补偿)模式和 TCC(两阶段提交)模式

使用 AT(自动补偿)模式

在 AT 模式中,Seata会自动补偿事务,无需手动编写补偿逻辑。首先,我们来演示一个简单的转账场景,将资金从一个账户转移到另一个账户,并保证事务的一致性。

  1. 添加 @GlobalTransactional 注解
    在转账服务的方法上添加 @GlobalTransactional 注解来标记全局事务:
@Service
public class TransferService {@GlobalTransactionalpublic void transfer(String fromAccount, String toAccount, double amount) {// 扣除转出账户金额deductAmount(fromAccount, amount);// 增加转入账户金额addAmount(toAccount, amount);}// 实现扣除金额逻辑// ...// 实现增加金额逻辑// ...
}
  1. 测试 AT 模式
    编写测试用例来验证 AT 模式的事务管理:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TransferServiceTest {@Autowiredprivate TransferService transferService;@Testpublic void testTransfer() {// 假设从账户 A 转账 100 到账户 BtransferService.transfer("accountA", "accountB", 100.0);}
}

运行测试用例,观察转账是否成功,并查看日志确认 Seata 是否自动补偿了事务。

使用 TCC(两阶段提交)模式

在 TCC 模式中,我们需要手动编写 Try、Confirm 和 Cancel 三个阶段的逻辑,以确保事务的正确执行。下面我们来演示一个简单的订单创建场景,包括下单、扣减库存和创建订单三个阶段。

  1. 实现 TCC 接口
    创建一个 TCC 接口并实现 Try、Confirm 和 Cancel 三个阶段的逻辑:
public interface OrderTccService {@GlobalTransactionalboolean createOrder(OrderDTO orderDTO);@TwoPhaseBusinessAction(name = "orderTccService", commitMethod = "confirmOrder", rollbackMethod = "cancelOrder")boolean tryCreateOrder(OrderDTO orderDTO);boolean confirmOrder(OrderDTO orderDTO);boolean cancelOrder(OrderDTO orderDTO);
}
  1. 实现 TCC 逻辑
    在实现类中编写 TCC 逻辑:
@Service
public class OrderTccServiceImpl implements OrderTccService {@Overridepublic boolean tryCreateOrder(OrderDTO orderDTO) {// 预留库存逻辑// ...return true;}@Overridepublic boolean confirmOrder(OrderDTO orderDTO) {// 确认创建订单逻辑// ...return true;}@Overridepublic boolean cancelOrder(OrderDTO orderDTO) {// 取消创建订单逻辑// ...return true;}
}
  1. 测试 TCC 模式
    编写测试用例来验证 TCC 模式的事务管理:
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderTccServiceTest {@Autowiredprivate OrderTccService orderTccService;@Testpublic void testCreateOrder() {// 创建一个订单OrderDTO orderDTO = new OrderDTO();// 设置订单信息// ...orderTccService.createOrder(orderDTO);}
}

运行测试用例,观察订单的创建是否成功,并查看日志确认 TCC 模式的 Try、Confirm 和 Cancel 阶段是否正确执行。

集成Seata踩的坑

这里是我在集成过程中遇到的一些坑,可能和有不同的地方只做为参考。

Table ‘ddz.undo_log’ doesn’t exist

异常信息:process connectionProxy commit error: Table ‘ddz.undo_log’ doesn’t exist。
解决方法:在数据源中切少Seata需要的日志表;在每个数据源中新增undo_log表。

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=1 DEFAULT CHARSET=utf8;

no available service ‘null’ found, please make sure registry config correct

异常信息:出现这个的原因是我们没有把Seata的config.txt加载到nacos上。
解决方法:执行命令把配置加载到Nacos配置中心上。参考上面:把配置文件config.txt加载到nacos上

分布式事务未生效

原因:我们使用的dynamic多数据源,默认是没有开启Seata分布式事务的。
解决方法:在yml配置文件中的dynamic下添加seata: true配置以开启分布式事务。

dynamic-datasource can not find primary datasource

原因:出现这个是数据源配置信息错误,我这里出现这个异常的原因是我自己太不细心导致数据库连接(url)连接编写错了。
解决方法:仔细检查一下datasource 下面数据源的配置。

Communications link failure

原因:这里大部分原因是MySQL需要指明是否进行SSL连接,默认是开启SSL连接的。
解决方法:在数据库连接配置URL后追加&useSSL=false即可。

总结

随着分布式系统的不断发展,分布式事务领域也会不断进化。在未来,我们可以进一步探索更多的分布式事务模式和解决方案,以满足不同业务场景的需求。同时,Seata 作为一个活跃的开源项目,将会不断推出新的功能和改进,我们可以关注 Seata 社区的更新和贡献自己的力量。

此外,除了 Seata,还有其他一些分布式事务解决方案,例如 TCC-TransactionSAGAHSTC 等,这些方案也值得我们深入学习和探索。根据业务场景的不同,我们可以选择最合适的方案来解决分布式事务问题。

参考资料

Nacos 官方文档
Seata 官方文档
Spring Boot 官方文档

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

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

相关文章

pytest常用执行参数详解

1. 查看pytest所有可用参数 我们可以通过pytest -h来查看所有可用参数。 从图中可以看出&#xff0c;pytest的参数有很多&#xff0c;下面是归纳一些常用的参数&#xff1a; -s&#xff1a;输出调试信息&#xff0c;包括print打印的信息。 -v&#xff1a;显示更详细的信息。 …

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API&#xff1f; API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…

Kafka3.0.0版本——Broker(上下线)示例

目录 一、Broker&#xff08;上下线&#xff09;示例1.1、三台服务器信息1.2、先启动zookeeper集群&#xff0c;再启动kafka集群1.3、zookeeper客户端工具prettyZoo查看brokers中ids1.4、停止某一台kafka服务&#xff0c;再次查看brokers中ids1.5、重新启动停止的kafka服务&…

Python爬虫在电商数据挖掘中的应用

作为一名长期扎根在爬虫行业的专业的技术员&#xff0c;我今天要和大家分享一些有关Python爬虫在电商数据挖掘中的应用与案例分析。在如今数字化的时代&#xff0c;电商数据蕴含着丰富的信息&#xff0c;通过使用爬虫技术&#xff0c;我们可以轻松获取电商网站上的产品信息、用…

vue实现pdf预览功能

背景&#xff1a;材料上传之后点击预览实现在浏览器上预览的效果 效果如下&#xff1a; 实现代码如下&#xff1a; //预览和下载操作 <el-table-column fixed"right" label"操作" width"210"><template #default"scope">…

GaussDB数据库SQL系列-表连接(JOIN)

目录 一、前言 二、GaussDB JOIN 1、LEFT JOIN 2、LEFT JOIN EXCLUDING INNER JOIN 3、RIGHT JOIN 4、LEFT JOIN EXCLUDING INNER JOIN 5、INNER JOIN 6、FULL OUTER JOIN 7、FULL OUTER JOIN EXCLUDING INNER JOIN 三、GaussDB 实验示例 1、初始化实验表 2、LEFT …

无涯教程-Perl - getc函数

描述 此函数从FILEHANDLE中读取下一个字符(如果未指定,则从STDIN中读取),并返回值。 语法 以下是此函数的简单语法- getc FILEHANDLEgetc返回值 此函数返回错误或文件结尾的undef以及从FILEHANDLE读取的字符值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$k…

PS透明屏,在科技展示中,有哪些优点展示?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…

SDXL-Stable Diffusion改进版

文章目录 1. 摘要2. 算法&#xff1a;2.1 结构&#xff1a;2.2 微小的条件机制2.3 多宽高比训练2.4 改进自编码器2.5 所有组合放到一起2.6 主流方案比较 3. 未来工作4. 限制 论文&#xff1a; 《SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis…

MATLAB详细安装教程(亲测有效!!)

1.复制以下链接&#xff0c;用百度网盘打开&#xff0c;下载 链接&#xff1a;https://pan.baidu.com/s/19AwQeCRYofGAV8sfDIm5PQ 提取码&#xff1a;mads 我是下载到D盘自己创建的文件中 2.下载完毕后打开此文件夹&#xff0c;点击最后一项 3.点击右上角高级选项&#xff0…

数据可视化(八)堆叠图,双y轴,热力图

1.双y轴绘制 #双Y轴可视化数据分析图表 #add_subplot() dfpd.read_excel(mrbook.xlsx) x[i for i in range(1,7)] y1df[销量] y2df[rate] #用来正常显示负号 plt.rcParams[axes.unicode_minus]False figplt.figure() ax1fig.add_subplot(1,1,1)#一行一列&#xff0c;第一个区域…

matlab智能算法程序包89套最新高清录制!matlab专题系列!

关于我为什么要做代码分享这件事&#xff1f; 助力科研旅程&#xff01; 面对茫茫多的文献&#xff0c;想复现却不知从何做起&#xff0c;我们通过打包成品代码&#xff0c;将过程完善&#xff0c;让您可以拿到一手的复现过程以及资料&#xff0c;从而在此基础上&#xff0c;照…

Eclipse如何自动添加作者、日期等注释

一、创建类时自动添加注释 1、Window->Preferences 2、Java->Code Syle->Code Templates->Code->New Java files->Edit->要添加的注释->Apply 二、选中要添加的类或者方法通过AltShiftJ快捷键添加 1、Window->Preferences 2、Java->Code Syle…

java+springboot+mysql校园通讯录管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的校园通讯录管理系统&#xff0c;系统包含超级管理员、管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;部门管理&#xff1b;用户管理&#xff1b;留言管理&#xff1b;公…

sqlserver 数据库显示 正在还原

问题描述之前不太会搞差异备份的恢复&#xff0c;然后恢复发生了失败之后这个数据库一直处于(正在还原……状态 并且出现数据库无法访问的情况 尝试解决1执行查询Restore Database 数据库名称 with Recovery然后不太能行 2执行查询Restore Database 数据库名称 with NoRecovery…

springboot+jpa+mysql电子数码商城含后台管理源码

#开发技术 #前端 bootstarp框架 html页面 #后端技术 SpringBoot SpringMvc jpa #开发工具 eclipse或者idea jdk1.8 mysql5点几版本 maven环境 maven3.5 前端地址&#xff1a;&#xff1a;http://localhost:8080/mall 后台地址&#x…

Lombok 中 @EqualsAndHashCode注解的使用

Lombok 中 EqualsAndHashCode注解的使用 EqualsAndHashCode注解的作用 EqualsAndHashCode注解的作用就是自动实现model类的equals方法和hashcode方法。我们在实际工作中经常会使用lombok来简化我们的开发&#xff0c;例如我们可以在定义的model类上添加Data注解&#xff0c;从…

Flowable-结束事件-取消结束事件

目录 定义图形标记XML内容使用示例视频教程 定义 取消结束事件只能与 BPMN 事务子流程结合使用&#xff0c;它可以取消一个事务子流程的执行&#xff0c;同时 也只能在子流程中执行。实际应用中&#xff0c;会把取消事件&#xff0c;事务子流程&#xff0c;补偿事件一起用。当…

powershell几句话设置环境变量

设置环境变量比较繁琐&#xff0c;现在用这段话&#xff0c;在powershell中就可以轻松完成。 $existingPath [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath "C:\Your\Path\Here"if ($existingPath -split ";"…