SpringBoot处理内外事务及线程ID使⽤
1.SpringBoot处理内外事务
场景如下:
某个接⼝,内部会调⽤其他多个接⼝,这些接⼝属于同⼀个事务下,统⼀回滚或提交,在出异常的情况下,需要修改其他数据的订单
状态,所以事务的⼀致性是不能保证的,需要对事务级别进⾏限制
解决⽅式:
springboot是啥1.设置独⽴事务,给同⼀事务下的⽅法设置⾃⼰的独⽴事务,⾃⼰提交或者回滚,不知道啥问题,楼主测试后⽆效
@Transactional(propagation = Propagation.REQUIRES_NEW)
2.⼿动处理事务(类似于独⽴事务,出现异常⼿动回滚,外部不会接收异常,返回相应code码或者状态判断即可)
/
/第⼀步注⼊事务数据管理器
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
//第⼆步声明并创建DefaultTransactionDefinition类,该类为TransactionDefinition的⼦类,很多⼈都说直接注⼊TransactionDefinition类,经测试⽆效,猜想是事务级别    //此处声明DefaultTransactionDefinition类
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
//很重要的⼀点,设置事务的级别,可以查看源码来得知独⽴事务的级别并设置        defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PR    //传⼊事务管理器
TransactionStatus transactionStatus = Transaction(defaultTransactionDefinition);
//第三步,在需要⼿动管理事务的地⽅提交或者回滚
//回滚
//提交
dataSourceTransactionManagermit(transactionStatus);
这⾥需要说明的是,⼿动触发事务后,外部try{}catch{}是⽆法捕捉异常的,可以⾃定义返回码或者状态在外⾯判断,然后在外⾯处理
⾃⼰想处理的其他数据.
2.线程ID的使⽤
在我的博⽂中,有⼀个严重错误,就是定义的json是全局的,导致数据会出现错乱的现象,但是和过滤器之间想要进⾏数据间的交
互,我这⾥采⽤的是获取线程ID的形式进⾏辨别
//获取线程ID
Thread.currentThread().getId();
//获取线程名称
Thread.currentThread().getName();
因为线程的特性,在请求未结束前,线程ID是不会被占⽤和复⽤的,这样在请求⽇志中可以在redis中⽤线程ID作为key进⾏数据存储,在过
滤器中获取响应数据,然后通过线程ID获取缓存数据再次更新,等待操作结束存⼊静态集合后,删除该缓存即可
//获取返回值
byte[] content = Content();
//判断是否有值
if (content.length > 0) {
String str = new String(content, "UTF-8");
ServletOutputStream out = OutputStream();
out.write(content);
out.flush();
JSONObject endJson = (JSONObject) (Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName());
if(!String(URI).contains(DOWMLOAD_FILE)){
endJson.put("response",str);
redisService.put(Thread.currentThread().getName(),endJson,timeout);
JSONObject endJsons = (JSONObject) (Thread.currentThread().getName());                logProcess.addData(endJsons);
//删除当前缓存数据
redisService.deleteString(Thread.currentThread().getName());
}
}
不知道还有没有其他的关联办法,楼主⽬前还没有想到...
权当技术积累先记录下来,后续有想法再来这⾥温习⼀下

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。