tcc-transaction 分布式事务-完整代码实现

1、说明

        这里给出完整实现代码,关于使用方法具体介绍请参考上一篇博文:

       分布式事务之-tcc-transaction(Dubbo版):https://blog.csdn.net/u013278314/article/details/85112314

2、系统介绍

        实现一个订单、红包的分布式系统,在生成订单的时候,调用红包服务,同时保持数据到红包数据库

3、实现

3、1 parent工程

系统接口图:

pom.xml


	4.0.0
	dubbo-tcc
	tcc-parent
	0.0.1-SNAPSHOT
	pom

	
		4.12
		4.2.4.RELEASE
		3.4.6
		1.3.1
		1.2.15
		8.0.11
		1.6.4
		2.4.2
		1.1.10
		4.3.5
		1.2
		2.5
		2.0
		3.3.2
		1.3.2
		3.3
		5.1.6
		0.9.1
		1.3.1
		2.5.3
		3.4.7
		0.1
		2.2.2
		0.9.1.2
	


	
		
			
			
				org.apache.commons
				commons-lang3
				${commons-lang3.version}
			
			
				org.apache.commons
				commons-io
				${commons-io.version}
			
			
				commons-net
				commons-net
				${commons-net.version}
			
			
			
				com.fasterxml.jackson.core
				jackson-databind
				${jackson.version}
			
			
			
				org.apache.httpcomponents
				httpclient
				${httpclient.version}
			
			
			
				org.quartz-scheduler
				quartz
				${quartz.version}
			
			
			
				junit
				junit
				${junit.version}
				test
			
			
			
				org.slf4j
				slf4j-log4j12
				${slf4j.version}
			
			
			
				org.mybatis
				mybatis
				${mybatis.version}
			
			
				org.mybatis
				mybatis-spring
				${mybatis.spring.version}
			
			
			
				mysql
				mysql-connector-java
				${mysql.version}
			
			
			
				com.alibaba
				druid
				${druid.version}
			
			
			
				org.springframework
				spring-context
				${spring.version}
			
			
				org.springframework
				spring-beans
				${spring.version}
			
			
				org.springframework
				spring-webmvc
				${spring.version}
			
			
				org.springframework
				spring-jdbc
				${spring.version}
			
			
				org.springframework
				spring-aspects
				${spring.version}
			
			
				org.springframework
				spring-context-support
				${spring.version}
			
			
				org.springframework
				spring-tx
				${spring.version}
			
			
				org.springframework
				spring-aop
				${spring.version}
			



			
			
				jstl
				jstl
				${jstl.version}
			
			
				javax.servlet
				servlet-api
				${servlet-api.version}
				provided
			
			
				javax.servlet
				jsp-api
				${jsp-api.version}
				provided
			
			
			
				com.alibaba
				dubbo
				${dubbo.version}
			
			
				org.apache.zookeeper
				zookeeper
				${zookeeper.version}
			
			
				com.github.sgroschupf
				zkclient
				${zkclient.version}
			

			
				c3p0
				c3p0
				${c3p0.version}
			


		
	

	
		${project.artifactId}
		
			
			
				org.apache.maven.plugins
				maven-resources-plugin
				2.7
				
					UTF-8
				
			
			
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.2
				
					1.8
					1.8
					UTF-8
				
			
		
		
			
				
				
					org.apache.tomcat.maven
					tomcat7-maven-plugin
					2.2
				
			
		
	

3.2、service-api:

tcc-transaction 分布式事务-完整代码实现_第1张图片

pom:


	4.0.0
	dubbo-tcc
	tcc-service-api
	0.0.1-SNAPSHOT


	
		
			org.mengyun
			tcc-transaction-spring
			1.2.4.23
		

		
			org.mengyun
			tcc-transaction-dubbo
			1.2.4.23
		
	

order.java:

package com.th.entity;

import java.io.Serializable;

public class Order implements Serializable{

	private static final long serialVersionUID = 4474290190954017721L;

	private Integer orderId;
	private String name;
	private Integer status;

	public Integer getOrderId() {
		return orderId;
	}

	public void setOrderId(Integer orderId) {
		this.orderId = orderId;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

}

RedPacket.java:

package com.th.entity;

import java.io.Serializable;

public class RedPacket implements Serializable {

	private static final long serialVersionUID = 2853121445210943100L;

	private Integer id;
	private Integer orderId;
	private Integer num;
	private Integer status;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getOrderId() {
		return orderId;
	}

	public void setOrderId(Integer orderId) {
		this.orderId = orderId;
	}

	public Integer getNum() {
		return num;
	}

	public void setNum(Integer num) {
		this.num = num;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

}

orderService.java:

package com.th.service;

import org.mengyun.tcctransaction.api.Compensable;

import com.th.entity.Order;

public interface OrderService {

	@Compensable
	Integer insert(Order order);
}

RedPacketService.java:

package com.th.service;

import org.mengyun.tcctransaction.api.Compensable;

import com.th.entity.Order;

public interface RedPacketService {

	/**
	 * 新增红包接口
	 */
	@Compensable
	Integer insertRedPacket(Order order);

}

 

3.3、redpacket

tcc-transaction 分布式事务-完整代码实现_第2张图片

pom:


	4.0.0
	dubbo-tcc
	tcc-redpacket
	0.0.1-SNAPSHOT
	war

	
		dubbo-tcc
		tcc-parent
		0.0.1-SNAPSHOT
	

	

		
			dubbo-tcc
			tcc-service-api
			0.0.1-SNAPSHOT
		

		
			org.mengyun
			tcc-transaction-spring
			1.2.4.23
		

		
			org.mengyun
			tcc-transaction-dubbo
			1.2.4.23
		

		
		
			org.springframework
			spring-context
		
		
			org.springframework
			spring-beans
		
		
			org.springframework
			spring-webmvc
		
		
			org.springframework
			spring-jdbc
		
		
			org.springframework
			spring-aspects
		
		
			org.springframework
			spring-context-support
		
		
			org.springframework
			spring-tx
		
		
			org.springframework
			spring-aop
		

		
		
			com.alibaba
			dubbo
			
				
					spring
					org.springframework
				
				
					netty
					org.jboss.netty
				
			
		
		
			org.apache.zookeeper
			zookeeper
		
		
			com.github.sgroschupf
			zkclient
		

		
			org.mybatis
			mybatis
			${mybatis.version}
		
		
			org.mybatis
			mybatis-spring
			${mybatis.spring.version}
		
		
		
			mysql
			mysql-connector-java
			${mysql.version}
		
		
		
			com.alibaba
			druid
			${druid.version}
		

		
			c3p0
			c3p0
			${c3p0.version}
		

		
		
			jstl
			jstl
			${jstl.version}
		
		
			javax.servlet
			servlet-api
			${servlet-api.version}
			provided
		
		
			javax.servlet
			jsp-api
			${jsp-api.version}
			provided
		

		
			junit
			junit
			test
		


	

	
		
			
				org.apache.tomcat.maven
				tomcat7-maven-plugin
				
					/tcc-redpacket
					8082
				
			
		
	

dao.xml:




	
		
		
	

	

provider-xml:




	

	

	
	

	

	

servlet.xml:




	

	
	

tcc-xml:




	
	
	

	

	

	
		
		
		
	

	
		
		
		
	

	
		
		
		
		
		
		
	


trans.xml:




	

	
		
		
		
		
		
		
	

	
	
		
		
	
	
	
	
	

tccjdbc.properties:

#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url2=jdbc:mysql://localhost:3306/cloudDB03?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=123456

db.properties:

#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cloudDB02?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
tccjdbc.url=jdbc:mysql://localhost:3306/cloudDB03?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=123456

SqlMapConfig.xml:




	
	

redPakcetMapper.xml:






	
		INSERT INTO red_packet(id,orderId,num,status) values(#{id},#{orderId},#{num},#{status})
	

	
		UPDATE red_packet SET STATUS = #{status} WHERE id = #{id}
	

	
		DELETE FROM red_packet WHERE id = #{id}
	


RedPacketDao.java:

package com.th.dao;

import org.apache.ibatis.annotations.Mapper;

import com.th.entity.RedPacket;

@Mapper
public interface RedPacketDao {
	Integer insert(RedPacket packet);

	int update(RedPacket packet);

	int delete(RedPacket packet);
}

RedPacketServiceImpl:

package com.th.service.impl;

import org.mengyun.tcctransaction.api.Compensable;
import org.mengyun.tcctransaction.dubbo.context.DubboTransactionContextEditor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.th.dao.RedPacketDao;
import com.th.entity.Order;
import com.th.entity.RedPacket;
import com.th.service.RedPacketService;

@Service("redPacketServiceImpl")
public class RedPacketServiceImpl implements RedPacketService {

	@Autowired
	private RedPacketDao redPacketDao;

	@Override
	@Compensable(confirmMethod = "confirmInsertRedPacket", cancelMethod = "cancelInsertRedPacket", transactionContextEditor = DubboTransactionContextEditor.class)
	public Integer insertRedPacket(Order order) {
		RedPacket redPacket = new RedPacket();
		redPacket.setOrderId(1);
		redPacket.setNum(1);
		redPacket.setId(1);
		redPacket.setStatus(-1);

		System.out.println("redPacketInsert");

		redPacketDao.insert(redPacket);

		return redPacket.getOrderId();
	}

	@Transactional
	public void confirmInsertRedPacket(Order order) {
		System.out.println("confirmRedPacketInsert");

		RedPacket redPacket = new RedPacket();
		redPacket.setOrderId(1);
		redPacket.setNum(1);
		redPacket.setId(1);
		redPacket.setStatus(0);

		redPacketDao.update(redPacket);

	}

	@Transactional
	public void cancelInsertRedPacket(Order order) {
		System.out.println("cancelRedPacketInsert");

		RedPacket redPacket = new RedPacket();
		redPacket.setOrderId(1);
		redPacket.setNum(1);
		redPacket.setId(1);
		redPacket.setStatus(1);

		redPacketDao.delete(redPacket);
	}

}

3.4、Order系统

tcc-transaction 分布式事务-完整代码实现_第3张图片

pom.xml:


	4.0.0
	
		dubbo-tcc
		tcc-parent
		0.0.1-SNAPSHOT
	

	tcc-order
	war

	

		
			dubbo-tcc
			tcc-service-api
			0.0.1-SNAPSHOT
		

		
			org.mengyun
			tcc-transaction-spring
			1.2.4.23
		

		
			org.mengyun
			tcc-transaction-dubbo
			1.2.4.23
		

		
		
			org.springframework
			spring-context
		
		
			org.springframework
			spring-beans
		
		
			org.springframework
			spring-webmvc
		
		
			org.springframework
			spring-jdbc
		
		
			org.springframework
			spring-aspects
		
		
			org.springframework
			spring-context-support
		
		
			org.springframework
			spring-tx
		
		
			org.springframework
			spring-aop
		

		
		
			com.alibaba
			dubbo
			
				
					spring
					org.springframework
				
				
					netty
					org.jboss.netty
				
			
		
		
			org.apache.zookeeper
			zookeeper
		
		
			com.github.sgroschupf
			zkclient
		

		
			org.mybatis
			mybatis
			${mybatis.version}
		
		
			org.mybatis
			mybatis-spring
			${mybatis.spring.version}
		
		
		
			mysql
			mysql-connector-java
			${mysql.version}
		
		
		
			com.alibaba
			druid
			${druid.version}
		

		
		
			jstl
			jstl
			${jstl.version}
		
		
			javax.servlet
			servlet-api
			${servlet-api.version}
			provided
		
		
			javax.servlet
			jsp-api
			${jsp-api.version}
			provided
		

		
			junit
			junit
			test
		

	

dao.xml:



	
	
	
	
	
	
		
		
		
		
		
		
	
	
	
	
		
		
		
		
		
	
	
	
	 
	

mvc.xml:




	
	
	
	
	
		
		
	
	
	
	

	
	
	



	

service.xml:




	
	
	


	
	


	

	
	
	
	


	
	
		
		
		
		
		
		
	

	
		
		
		
	

	
		
		
		
		
			
				com.alibaba.dubbo.remoting.TimeoutException
			
		
	



trans.xml:




	

	
	
		
		
	
	
	
		
			
			
			
			
			
			
			
			
			
			
		
	
	
	
		
	

db.properties.xml:

#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cloudDB02?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
tccjdbc.url=jdbc:mysql://localhost:3306/cloudDB03?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=123456

SqlMapConfig.xml:




	
	

orderMapper.xml:






	
		INSERT INTO t_order(orderId,name,status) values(#{orderId},#{name},#{status})
	

	
		UPDATE t_order SET status = #{status} WHERE orderId = #{orderId}
	


	
		DELETE FROM t_order WHERE orderId = #{orderId}
	


OrderController.java:

package com.th.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.th.entity.Order;
import com.th.service.OrderService;

@Controller
public class OrderController {

	@Autowired
	private OrderService orderService;

	// @Autowired
	// private RedPacketService redPacketService;

	@RequestMapping(value = "/createOrder", produces = { "application/json;charset=UTF-8" })
	@ResponseBody
	//@Transactional
	public String createOrder() {
		Order order = new Order();
		Integer id = orderService.insert(order);

		return "订单创建成功,订单ID: " + id;
	}

}

OrderDao.java:

package com.th.dao;

import org.apache.ibatis.annotations.Mapper;

import com.th.entity.Order;

@Mapper
public interface OrderDao {

	Integer insert(Order order);

	int update(Order order);

	int delete(Order order);
}

OrderServiceImpl.java:

package com.th.service.impl;

import org.mengyun.tcctransaction.api.Compensable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.th.dao.OrderDao;
import com.th.entity.Order;
import com.th.service.OrderService;
import com.th.service.RedPacketService;

@Service
@Component
public class OrderServiceImpl implements OrderService {

	@Autowired
	private OrderDao orderDao;

	@Autowired
	private RedPacketService redPacketService;

	@Override
	@Compensable(confirmMethod = "confirmInsert", cancelMethod = "cancelInsert", asyncConfirm = true)
	@Transactional
	public Integer insert(Order order) {
		Order orde = new Order();
		orde.setName("电脑");
		orde.setOrderId(1);
		orde.setStatus(-1);

		orderDao.insert(orde);

		redPacketService.insertRedPacket(orde);

		//int i = 1 / 0;

		return order.getOrderId();
	}

	public void confirmInsert(Order order) {
		System.out.println("confirmOrderInsert");

		Order orde = new Order();
		orde.setName("电脑");
		orde.setOrderId(1);
		orde.setStatus(0);

		orderDao.update(orde);

	}

	public void cancelInsert(Order order) {
		System.out.println("cancelOrderInsert");

		Order orde = new Order();
		orde.setName("电脑");
		orde.setOrderId(1);
		orde.setStatus(1);

		orderDao.delete(orde);

	}

}

4、测试

你可能感兴趣的:(系统架构,分布式事务)