DataSourceTransactionManager进行事务管理

  最近在做报表excel导入插入数据的时候,插入数据之前要清除当前用户和报告期下的数据,删除后执行错误导致删除运行,接口报错,

redis中获取的数据没有刷新,导致再次执行其他操作时报错。

  在这里用到DataSourceTransactionManager进行事务管理,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个sql执行不成功,都表示这个业务没有执行完成,对前面的sql执行进行回滚。

  事务是数据库中的概念,就是对数据库的一组操作,由一条或多条sql组成。

  事务具有同步的特点,一条sql执行失败,其他sql都不会执行,即要么都执行,要么都不执行

xml配置:

1<!-- 定义事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/></bean> 2 3<!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务 --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 4 5<bean id="dataSource" class="net.bull.javamelody.SpringDataSourceFactoryBean"> <property name="targetName" value="kdataDataSource" /></bean> 6 7public class KdataTxUtil { 8 9 public static DataSourceTransactionManager getTxManager(){ 10 DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) SpringContextHolder 11 .getBean("transactionManager"); 12 return transactionManager; 13 } 14 15 public static TransactionStatus newTransaction(){ 16 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 17 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。 18 TransactionStatus status = getTxManager().getTransaction(def); // 获得事务状态 19 return status ; 20 } 21 22 public static void commit(TransactionStatus status) { 23 if ( status != null) { 24 getTxManager().commit(status); 25 } 26 } 27 28 public static void rollback(TransactionStatus status) { 29 if( status != null) { 30 getTxManager().rollback(status); 31 } 32 } 33}

封装controller(web层)调用service接口

1public Map callTxService(HttpServletRequest request, HttpServletResponse response,Class<? extends KdataService> serviceClass) { 2 long start = System.currentTimeMillis() ; 3 4 request.setAttribute("_req_start_time",System.currentTimeMillis()); 5 KdataContext.init(); 6 7 IResult rsParamCheck = new Result(); 8 rsParamCheck.failed("begin param check..."); 9 10 IResult rs = new Result(); 11 rs.failed("begin process ..."); 12 rs.setRequestTraceId(KdataContext.getContextAsString(KdataContext.SYS_REQUEST_TRACE_ID)); 13 KdataContext.traceHttpServletRequest(request); 14 Map params = RestParam.parse( request); 15 KdataContext.traceSetReqParam(params); 16 TransactionStatus ts = KdataTxUtil.newTransaction() ;//获取事物对象 17 try { 18 KdataService kdataService = SpringContextHolder.getBean(serviceClass); 19 20 kdataService.doService(params,rs); 21 22 KdataTxUtil.commit(ts); 23 }catch(KdataRollbackException e) { 24 KdataTxUtil.rollback(ts); 25 26 StringBuffer sb = new StringBuffer( e.getMessage()); 27 e.printStackTrace(); 28 rs.setException(Exceptions.getStackTraceAsString(e)); 29 rs.failed( sb.toString()); 30 }catch(Exception e) { 31 KdataTxUtil.rollback(ts); 32 33 StringBuffer sb = new StringBuffer("请求处理异常:"+e.getMessage()); 34 e.printStackTrace(); 35 rs.setException(Exceptions.getStackTraceAsString(e)); 36 if( e instanceof NullPointerException) { 37 rs.failed("空指针异常:"+Exceptions.getStackTraceAsString(e)); 38 } else { 39 rs.failed( sb.toString()); 40 } 41 42 } 43 44 KdataContext.addRequestTraceLog( rs);//添加日志 45 46 long end = System.currentTimeMillis(); //System.nanoTime() 47 rs.setTimeSpent( end-start); 48 return RestResult.getRestResult(rs); 49}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )