当前位置: 首页 > news >正文

mysql事物捕捉异常回滚_事务场景中,手动捕获异常时记得显式回滚事务

阿里巴巴《Java开发手册》:事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

今天装了一个ali编码规约插件,在对工程做编码规约扫描时,也给出了这个提示。

758e8a11ff102fa2a28fbc90a96c5d13.png

汇票系统,下述发布贴现方法,要求先创建票据再创建贴现交易,整体是一个事务。如果不加异常捕获,那么一旦程序执行出现RuntimeException后,AOP捕获异常后默认会先回滚事务再throw,只不过这样对调用方(有时)不“友好”; 加了try..catch捕获到异常后,如果不显式回滚,那么,前面的“创建票据”就提交到db了,所以,为保证事务的一致性,就要手动回滚事务,并返回创单失败。

public classTradeOrderServiceImpl{

@Autowired

TradeOrderServiceImpl tradeOrderService;

@Autowired

DraftInfoServiceImpl draftInfoService;/*** 发布贴现

**/@TransactionalpublicResponseModel publish(String merId, String openBank, BigDecimal amt){

DraftInfoModel draftInfoModel= newDraftInfoModel();

draftInfoModel.setMerchantId(merId);

draftInfoModel.setAmt(amt);

... ...//创建票据

DraftInfoModel res_draftInfoModel =draftInfoService.addDraftInfo(draftInfoModel);try{

TradeOrderModel tradeOrderModel= newTradeOrderModel();

tradeOrderModel.setSellerMerchantId(merId);

tradeOrderModel.setOpenBank(openBank);//openBank超长会导致mySQL的Data truncated for column异常。

tradeOrderModel.setPlatFeeAmt(amt);

tradeOrderModel.setDraftId(res_draftInfoModel.getDraftId());

... ...//创建贴现交易

TradeOrderModelRes tradeOrderModelRes =tradeOrderService.publishDraftDiscount(tradeOrderModel);

}catch(Exception e){//手动回滚事务

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//返回创单失败

return new ResponseModel(false, ExceptionUtils.getMessage(e));

}//返回创单完成

return new ResponseModel(true);

}

}

如下testcase作用是新增转账原因,使用@Transactional注解开启了事务,当执行第二个insert时,由于数据超长报异常:### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'transfer_reason' at row 1。此时会整体回滚事务,两个转账原因都未持久化。

@Test

@Transactionalpublic voidinsertTransferReason(){

List batchPayRecordDetails = batchPayRecordDetailMapper.selectByExample(newBatchPayRecordDetailExample());if(CollectionUtils.isEmpty(batchPayRecordDetails)){

Assert.fail("no data");

}

String auditMan="test";

BatchPayRecordDetail recordDetail=batchPayRecordDetails.get(0);

System.out.println("==============================");

recordDetail.setPayReason(UUID.randomUUID().toString());int i1 =managerBll.insertTransferReason(recordDetail, auditMan);

System.out.println(i1);

recordDetail.setPayReason(UUID.randomUUID().toString()+"测试(String), 39c535de-79ff-4fc4-a514-5c431ad4157d2019-04-04 11:26:43,147 DEBUG [main] (BaseJdbcLogger.java:145) 6219 - ==> Preparing: insert into transfer_account_reason (transfer_reason_(String), 0(String), SUCCES(String), test(String), null, null\n" +

"2019-04-04 11:28:42,975 DEBUG [main] (BaseJdbcLogger.java:145) 6611 - <== Updates: 1");int i =managerBll.insertTransferReason(recordDetail, auditMan);

System.out.println(i);

}

相关文章:

  • mysql 不同版本多实例_MySQL 不同版本多实例
  • vue 时间刻度_一个基于Vue的时钟
  • arcgis数据导入mysql_jsp连接MySQL操作GIS地图数据实现添加point的功能代码
  • build vue3 后压缩的文件在哪_vue-cli脚手架之build文件夹三
  • window中mysql bat脚本_MySQL window环境下bat脚本定时备份
  • mybatis 字段名自动转小写_mybatis 返回Map类型key改为小写的操作
  • phppython混合开发_PHP资深开发者谈:缘何放弃PHP改用Python
  • python中init和new_Python中__init__和__new__的区别详解
  • lightgbm原理_LightGBM算法原理小结
  • mysql中以下正确的sql是_MySQL数据库中下面两句话的区别:
  • mysql安装需要jdkcheck_linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境...
  • mysql模糊查询员工信息_PHP+MySQL实现模糊查询员工信息功能示例
  • mysql regexp_replace_mysql-使用DISTINCT的REGEXP_REPLACE
  • mysql 上周时间_mysql 获取上周1到周日的时间
  • mysql的备份和恢复命令行_使用MySQL命令行备份和恢复数据库
  • 【React系列】如何构建React应用程序
  • Facebook AccountKit 接入的坑点
  • input的行数自动增减
  • javascript数组去重/查找/插入/删除
  • JSDuck 与 AngularJS 融合技巧
  • Laravel Mix运行时关于es2015报错解决方案
  • Node + FFmpeg 实现Canvas动画导出视频
  • Object.assign方法不能实现深复制
  • Python 反序列化安全问题(二)
  • Terraform入门 - 1. 安装Terraform
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里云前端周刊 - 第 26 期
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何进阶一名有竞争力的程序员?
  • 如何使用 JavaScript 解析 URL
  • 事件委托的小应用
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​学习一下,什么是预包装食品?​
  • # centos7下FFmpeg环境部署记录
  • #define用法
  • ()、[]、{}、(())、[[]]命令替换
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (LeetCode 49)Anagrams
  • (规划)24届春招和25届暑假实习路线准备规划
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)理解angular中的module和injector,即依赖注入
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)Neo4j下载安装以及初次使用
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (正则)提取页面里的img标签
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)大型网站架构演变和知识体系
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • 、写入Shellcode到注册表上线
  • ... 是什么 ?... 有什么用处?
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .CSS-hover 的解释