这个微服务项目终于在8月份上线了,接下来就是修改一些不影响流程的bug了。
我被安排了加事务这个任务,
那么究竟什么是事务呢?
事务:分为本地事务和分布式事务
本地事务@Transactional(rollbackFor = {Exception.class, RuntimeException.class })
分布式事务@LcnTransaction(propagation = DTXPropagation.REQUIRED)
其实也很简单,区分增删改是否涉及到两个表的数据,注意:查询时是不加事务的!下一步就是区分是本地事务还是分布式事务。
本地事务:多个影响数据的操作,比如新增主表还新增合同表。
分布式事务:跨服务调用,且有影响数据的操作。
在service层的@Override层上加入事务注解就可以
/**
* 新增物流线路,车辆
*
* @param env
* @param vo
* @param lvos
* @param cnl 1:保存2:发布
* @return
* @throws Exception
*/
@Transactional(rollbackFor = {Exception.class, RuntimeException.class })
@Override
public String insert(ClientEnvironment env, LogisticspublishVO vo, LogisticsvehiclesVO[] lvos, String cnl)
throws Exception {
// 系统当前时间
Date day = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
给所有模块加完事务注解之后就要开始验证了,验证分布式事务被调用方是否也需要加事务注解。最开始我自己测试的时候报告说不用,后来就打脸了,真疼。
测试流程:
1,先测试挂牌,第一步改泛接口,防止调到别的服务。接下来改订单中心泛接口
2,先测试正常流程是否能生成订单:
2.1先看euraka是否注册上去,后看txlcn7970本地事务是否注册上去,
测试情况分两种,feign调用之前,
在挂牌生成订单的代码里抛异常
抓取了挂牌的更新sql,
UPDATE li_listing_transaction li
SET ts = '2019-08-28 15:28:14',
li.available = '1210.0',
li.used = '24.0',
li.approval_status = 4
WHERE
li.id = 'bhwqzbgnqwsa6yv0hjgdqy'
接着,根据id查询挂牌的表
然后挂牌表查询:可供应量,已供应量,状态并没有改变,证明事务回滚了。
接着看order的insert语句,根据order_id查询是否有订单
查询订单中心表:为订单中心有数据!事务没有回滚。
测试说明分布式事务被调用方必须也加分布式事务!哭了
在order中加上分布式事务后:
根据order_id查询:
查询结果为空,证明事务回滚了。说明订单中心也必须加分布式事务!真棒