六、TxManager搭建
1. 创建项目,添加依赖
新建项目TxManager,并添加依赖。
依赖包含了Spring-boot的依赖,版本是2.0.5,如果希望把版本改变成2.2.2或其他版本只需要添加spring-boot-starter-parent继承即可
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的项目的配置文件中进行配置。
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
4. 新建启动类
注意注解@EnableTrasactionManagerServer必须有。
5. 访问管理界面
在浏览器输入:http://localhost:7970 访问。
密码默认是codingapi
可以在配置文件中修改登录密码
七、LCN事务模式
1. 创建数据库表
注意:不要给student表添加外键约束。如果添加会导致分布式事务执行时student新增失败,因为teacher没有提交时student的tid值无法获取。
2. 创建项目
案例使用聚合项目进行演示。
创建父项目,名称为LcnParent
2.1 配置pom.xml
txlcn-tc 是TX-LCN的客户端包
txlcn-txmsg-netty 是LCN客户端连接TxManager需要的包
3. 新建pojo项目
把实体类提出了
新建两个实体类。
新建com.bjsxt.pojo.Teacher
新建com.bjsxt.pojo.Student
4. 创建项目teacher_insert
新建teacher_insert项目
4.1 配置pom.xml
依赖pojo
4.2 编写配置文件
新建application.yml.
数据源连接的是Teacher表所在数据库
eureka单机版可以省略。
manager-address 配置TxManager项目的ip及端口。端口是内部访问端口,而不是可视化页面的端口。
4.3 新建mapper
新建com.bjsxt.mapper.TeacherMapper
4.4 新建service及实现类
新建com.bjsxt.service.TeacherService及实现类。
方法上@Transactional一定要有。本地事务控制。
@LcnTransaction表示当前方法加入到分布式事务控制。
@LcnTransaction属性propagation可取值
DTXPropagation.REQUIRED:默认值,表示如果当前没有事务组创建事务组,如果有事务组,加入事务组。多用在事务发起方。
DTXPropagation.SUPPORTS:如果当前没有事务组以本地事务运行,如果当前有事务组加入事务组。多用在事务参与方法。
4.5 新建控制器
新建com.bjsxt.controller.TeacherController。
由于在student_insert中通过OpenFeign进行条件,参数使用请求体数据,所以控制器方法的参数需要添加@RequestBody
4.6 新建启动器
新建com.bjsxt.TeacherInsertApplication。
一定要有注解@EnableDistributedTransaction表示启动分布式事务
5 新建项目student_insert
5.1 编写pom.xml
添加对pojo依赖
5.2 创建配置文件
新建application.yml
5.3 新建Feign接口
新建com.bjsxt.feign.TeacherInsertFeign
5.4 新建Mapper
新建com.bjsxt.mapper.StudentMapper
5.5 新建service及实现类
新建com.bjsxt.service.StudentService。
实现类中对Teacher和Student的主键都是随机数,为了测试时多次测试方便,所以没有给固定值。
Student的姓名通过客户端请求参数传递的,其他都不需要通过参数设置。
5.6 新建控制器
新建com.bjsxt.controller.StudentController
5.7 新建启动类
新建com.bjsxt.StudentInsertApplication
6. 测试结果
在浏览器中输入http://localhost:8081/insert?name=bjsxt后,如果页面显示1并且数据库teacher表和student表各增加一条数据表示新增成功。
为了测试分布式事务效果,在student_insert项目实现类方法return上面添加int i =5/0; 的算术异常,再次访问url页面会报500,并且数据库中没有新增数据,说明分布式事务成功了。
八、TCC事务模式(多模式混合使用)
在上面LCN事务模式代码基础上进行修改
1. 新建项目mongodb_insert
1.1 修改pom.xml
在当前项目中引入mongodb的依赖。如果在父项目中进行引入,则所有的子项目都需要配置mongodb的相关属性。
1.2 新建配置文件
新建application.yml。
虽然当前项目是连接Mongodb但是也需要配置MySQL数据源,因为LCN需要在MySQL中记录异常信息等。
配置文件中比别的项目多了MongoDB的配置。
1.3 新建实体类
新建com.bjsxt.pojo.People
1.4 新建service及实现类
新建com.bjsxt.service.PeopleService及实现类。
具有@TccTransaction注解的方法有以下特性
- 可以没有@Transactional
- 如果整个分布式事务所有方法执行都没有异常,会回调名称为:confirm+方法名首字母大写的方法。insert方法的回调方法叫做confirmInsert()。同时方法参数也可以传递给回调方法。
- 只要整个分布式事务中有一个方法出现异常,会回调cancel+方法名首字母大写的回调方法。需要在这个方法中编写事务回滚的业务。
@TccTransaction注解属性说明:
cancelMethod:明确指定失败的回调方法名
confirmMethod:明确指定成功的回调方法名
1.5 新建控制器
新建com.bjsxt.controller.PeopleController
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进行接收。
2.2 修改service实现类
修改com.bjsxt.service.impl.StudentServiceImpl。
在实现类中调用feign接口的方法。
当前方法依然使用LCN事务模式。方法上面加什么事务模式注解只考虑当前方法本地事务,不考虑调用远程方法的事务。如果当前方法中没有本地事务,全是调用远程方法,那么当前方法使用LCN或TCC事务模式都可以,但是必须要有事务模式,因为如果没有注解就不会想TxManager中创建事务组。