LCN分布式事务解决方案详解

一、什么是分布式事务?

7D4D2A6F-2BF8-4CEC-0DEA-0B884E155B9C.png

DCEB2B78-8901-4207-9140-B4146E4B2788.png

二、lcn的实现思路

Lcn 的本质就是提供了一个全局的事务管理器

本地事务的提交还是回滚,由全局的事务管理器决定

5EF58D48-25C6-F7D9-150C-4C953B4831EB.png

824D7E7E-5606-AF2C-A015-28A6ED1B72DD.png

2.1 本地执行的状态怎么提交给全局事务?

使用切面拦截本地事务的执行结果,使用tcp 发送给tx-manager

2.2 本地事务的提交或回滚怎么实现?

等待tx-manager通知自己

三、lcn的使用

3.1 下载lcn-manager (全局的事务管理器)

6BFE92C2-7D61-DA55-2881-10A382C6E645.png

3.2 配置lcn-manager

配置eureka 并且配置redis

96D89D43-B8BA-C22C-D8E9-64F7D7B506CA.png

5E47A84F-64D2-DC9D-B49A-92A3E16AD61B.png

Redis:

E3CC0BBD-47F9-1613-0BED-1A1836566D39.png

3.3 启动lcn

EF63655C-718B-1E65-C83C-9839ABF233CB.png

38A85620-EDED-AA34-0774-8A24350E4C26.png

3.4 模拟转账服务

数据库:

3DE6FB02-6B28-1F25-3D30-381048303A82.png

0F223BC0-1F6C-6F24-5DCF-1B89C1AA1A64.png

3.4.1 add-service

0965D223-AB49-13C4-BA19-98CF1FF05114.png

3.4.2 decr-service

4941751B-6DAC-C34A-9404-21C14D0A8925.png

3.5 2 个微服务都需要添加依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>com.codingapi</groupId>
			<artifactId>transaction-springcloud</artifactId>
			<version>${lcn.last.version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>*</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>com.codingapi</groupId>
			<artifactId>tx-plugins-db</artifactId>
			<version>${lcn.last.version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>*</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- 依据druid 来实现的拦截功能 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.19</version>
		</dependency>

3.6 需要自定义数据库的连接池

在2 个微服务的启动类或配置类里面都可以添加

@Bean
	public DataSource dataSource() {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setUrl(env.getProperty("spring.datasource.url"));
		dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
		dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
		dataSource.setInitialSize(10);
		dataSource.setMaxActive(50);
		dataSource.setMinIdle(0);
		dataSource.setMaxWait(60000);
		dataSource.setValidationQuery("SELECT 1");
		dataSource.setTestOnBorrow(false);
		dataSource.setTestWhileIdle(true);
		dataSource.setPoolPreparedStatements(false);
		return dataSource;
	}

3.7 使用

3.7.1 事务的发起者

转账:935BA681-D951-D4A9-3722-EF7209C5B6CA.png

事务的参与者

减少钱:

12DA2A36-6D83-B67A-1987-EC75E6037F43.png

加钱:

E58F5B1F-DF63-0072-DA49-E1727F5CABCD.png

3.7.2 添加配置文件

EA77A716-5543-0516-C594-E917D1DCC62C.png

11678D15-BCEE-6E97-7510-CDE31A279904.png

3.8 启动2 个微服务

1C30C7F8-5174-833A-8517-2F9CE9062127.png

3.9 测试转账服务

A7FADBB2-38C7-9525-D454-791A28EA520B.png

81F80D65-6B97-24DE-0FC4-A4676D54AC3F.png

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的