当前位置: 首页>数据库>正文

mongodb 分布式部署 动态扩容 mongodb 分布式事务


六、TxManager搭建

1. 创建项目,添加依赖

新建项目TxManager,并添加依赖。

依赖包含了Spring-boot的依赖,版本是2.0.5,如果希望把版本改变成2.2.2或其他版本只需要添加spring-boot-starter-parent继承即可




mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务,第1张


2. 执行SQL文件

执行tx-manager.sql文件(在任意的数据库下执行即可)

tx-manager.sql在txlcn-tm-5.0.2.RELEASE.zip压缩包中。

在MySQL生成tx-manager的数据库,在数据库中新建t_tx_exception的表,此表用作存储事务组信息。

注意:

默认情况下tx-manager需要记录日志信息的,需要在项目中配置日志连接数据库相关参数,其中日志存储数据库没有要求,可以存储到任意数据库中,当运行后会自动在数据库中生成一个日志表。如果不希望记录日志可以直接设置tx-lcn.logger.enabled=false,关闭日志功能,下面的日志连接数据库参数也可以不用配置。

在实际案例演示中会把所有的日志记录功能关闭。如果希望记录记录日志需要把下面代码在所有引用tx-lcn的项目的配置文件中进行配置。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_02,第2张


3. 配置配置文件

在TxManager项目的resource下新建application.properties。tx-lcn在当前版本有个bug只能使用properties文件,使用yml文件会导致配置文件无法被加载的问题。

配置文件中内容上半部分是tx-manager数据库的连接信息。中间包含redis连接信息(此处连接的是redis单机版,端口默认,没有密码),下面是关闭日志记录功能

小提示:

依赖Redis,所以需要安装Redis。

7970是客户端访问端口,是Txmanager可视化界面访问端口,此端口任意。

更加详细配置信息可以看txlcn-tm-5.0.2.RELEASE.zip中application.properties


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_03,第3张


4. 新建启动类

注意注解@EnableTrasactionManagerServer必须有。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_mongodb 事务_04,第4张


5. 访问管理界面

在浏览器输入:http://localhost:7970 访问。

密码默认是codingapi

可以在配置文件中修改登录密码


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_05,第5张


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_06,第6张



七、LCN事务模式

1. 创建数据库表

注意:不要给student表添加外键约束。如果添加会导致分布式事务执行时student新增失败,因为teacher没有提交时student的tid值无法获取。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_07,第7张


2. 创建项目

案例使用聚合项目进行演示。

创建父项目,名称为LcnParent

2.1 配置pom.xml

txlcn-tc 是TX-LCN的客户端包

txlcn-txmsg-netty 是LCN客户端连接TxManager需要的包


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_08,第8张


3. 新建pojo项目

把实体类提出了

新建两个实体类。

新建com.bjsxt.pojo.Teacher


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_09,第9张


新建com.bjsxt.pojo.Student


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_10,第10张


4. 创建项目teacher_insert

新建teacher_insert项目

4.1 配置pom.xml

依赖pojo


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_11,第11张


4.2 编写配置文件

新建application.yml.

数据源连接的是Teacher表所在数据库

eureka单机版可以省略。

manager-address 配置TxManager项目的ip及端口。端口是内部访问端口,而不是可视化页面的端口。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_12,第12张


4.3 新建mapper

新建com.bjsxt.mapper.TeacherMapper


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_13,第13张


4.4 新建service及实现类

新建com.bjsxt.service.TeacherService及实现类。

方法上@Transactional一定要有。本地事务控制。

@LcnTransaction表示当前方法加入到分布式事务控制。

@LcnTransaction属性propagation可取值

DTXPropagation.REQUIRED:默认值,表示如果当前没有事务组创建事务组,如果有事务组,加入事务组。多用在事务发起方。

DTXPropagation.SUPPORTS:如果当前没有事务组以本地事务运行,如果当前有事务组加入事务组。多用在事务参与方法。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_14,第14张


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_15,第15张


4.5 新建控制器

新建com.bjsxt.controller.TeacherController。

由于在student_insert中通过OpenFeign进行条件,参数使用请求体数据,所以控制器方法的参数需要添加@RequestBody


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_16,第16张


4.6 新建启动器

新建com.bjsxt.TeacherInsertApplication。

一定要有注解@EnableDistributedTransaction表示启动分布式事务


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_17,第17张


5 新建项目student_insert

5.1 编写pom.xml

添加对pojo依赖


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_18,第18张


5.2 创建配置文件

新建application.yml


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_19,第19张


5.3 新建Feign接口

新建com.bjsxt.feign.TeacherInsertFeign


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_20,第20张


5.4 新建Mapper

新建com.bjsxt.mapper.StudentMapper


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_21,第21张


5.5 新建service及实现类

新建com.bjsxt.service.StudentService。

实现类中对Teacher和Student的主键都是随机数,为了测试时多次测试方便,所以没有给固定值。

Student的姓名通过客户端请求参数传递的,其他都不需要通过参数设置。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_22,第22张


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_23,第23张


5.6 新建控制器

新建com.bjsxt.controller.StudentController


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_mongodb 事务_24,第24张


5.7 新建启动类

新建com.bjsxt.StudentInsertApplication


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_25,第25张


6. 测试结果

在浏览器中输入http://localhost:8081/insert?name=bjsxt后,如果页面显示1并且数据库teacher表和student表各增加一条数据表示新增成功。

为了测试分布式事务效果,在student_insert项目实现类方法return上面添加int i =5/0; 的算术异常,再次访问url页面会报500,并且数据库中没有新增数据,说明分布式事务成功了。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_26,第26张



八、TCC事务模式(多模式混合使用)

在上面LCN事务模式代码基础上进行修改

1. 新建项目mongodb_insert

1.1 修改pom.xml

在当前项目中引入mongodb的依赖。如果在父项目中进行引入,则所有的子项目都需要配置mongodb的相关属性。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_27,第27张


1.2 新建配置文件

新建application.yml。

虽然当前项目是连接Mongodb但是也需要配置MySQL数据源,因为LCN需要在MySQL中记录异常信息等。

配置文件中比别的项目多了MongoDB的配置。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_28,第28张


1.3 新建实体类

新建com.bjsxt.pojo.People


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_mongodb 事务_29,第29张


1.4 新建service及实现类

新建com.bjsxt.service.PeopleService及实现类。

具有@TccTransaction注解的方法有以下特性

  1. 可以没有@Transactional
  2. 如果整个分布式事务所有方法执行都没有异常,会回调名称为:confirm+方法名首字母大写的方法。insert方法的回调方法叫做confirmInsert()。同时方法参数也可以传递给回调方法。
  3. 只要整个分布式事务中有一个方法出现异常,会回调cancel+方法名首字母大写的回调方法。需要在这个方法中编写事务回滚的业务。

@TccTransaction注解属性说明:

cancelMethod:明确指定失败的回调方法名

confirmMethod:明确指定成功的回调方法名


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_30,第30张


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_mongodb 事务_31,第31张


1.5 新建控制器

新建com.bjsxt.controller.PeopleController


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_mongodb 事务_32,第32张


1.6 测试

在浏览器输入 http://localhost:8082/insert?name=sxt 观察mongodb中是否出现了lcn的数据库,数据库中是否出现People的集合,people集合中name属性值为sxt

2. 修改student_insert

2.1 新建feign接口

新建com.bjsxt.feign.MongodbInsertFeign。

为了传递普通表单数据,insert方法参数由@RequestParam。mongodb_insert控制器方法参数就可以使用String name或People进行接收。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_数据库_33,第33张


2.2 修改service实现类

修改com.bjsxt.service.impl.StudentServiceImpl。

在实现类中调用feign接口的方法。

当前方法依然使用LCN事务模式。方法上面加什么事务模式注解只考虑当前方法本地事务,不考虑调用远程方法的事务。如果当前方法中没有本地事务,全是调用远程方法,那么当前方法使用LCN或TCC事务模式都可以,但是必须要有事务模式,因为如果没有注解就不会想TxManager中创建事务组。


mongodb 分布式部署 动态扩容 mongodb 分布式事务,mongodb 分布式部署 动态扩容 mongodb 分布式事务_无法启动分布式事务_34,第34张



https://www.xamrdz.com/database/6uc1937395.html

相关文章: