关于@Transactional(readonly = false)注解不起作用的可能性

readOnly=true表明所注解的方法或类只是读取数据。
readOnly=false表明所注解的方法或类是增加,删除,修改数据。
通常添加事务回滚注解都是在service层中,可以在类上,也可以在方法上:
注意点:

  1. service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。

  2. @Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。

  3. 默认情况下,spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。
    辣么什么是checked异常,什么是unchecked异常?

java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,
其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等

代码中事务不回滚常见错误:
有时候我们即使在service层中加了,但是还是没有实现回滚,
注意:如果在service 方法上添加了注解,方法的上一层controller一定要try catch捕获异常,

或者在当前try catch中添加
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

例如:

@Transactional(readOnly = false) 
	public boolean updatesetZszj(Ze54 ze54,Ze54 ze54own) throws Exception  {
		if (dao.updateset(ze54)>0){
				//设置卷宗号
				ze54own.setBze543(ze54.getBze543());
				//请求xml组装
				String dataXmlString=this.getXmlData(ze54own);
				//调用大唐组卷接口
		    	String resultxml = WebServiceClient.execute(dataXmlString, "archive", "admin");
		    	//为空时手动抛出异常,使更新回滚
		    	if(resultxml==null){
			    	throw  new RuntimeException("调用大唐组卷接口异常");
		    	}
		    	
				Map<String, Object> map = WebServiceClient.xml2Map(resultxml);
				Map<String, Object> map2=(Map<String, Object>)map.get("Success");
				String res=  map2.get("Code").toString();
				if(res.equals("true")){
					logger.info("组卷成功");
					return true;
				}else{
					logger.error("组卷失败,调用大唐组卷接口失败");
					return false;
				}
			
		}else{
			return false;
		}
	}

我这里是一个update方法,在update中 同时调用接口,当接口调用失败时,我返回一个null值,然后手动抛出RuntimeException 异常,注意这里一定要是RuntimeException,如果直接是Exception则不回滚,然后在上层的controller调用这个方法时,注意try catch就可以了。

例: 这里是一段更新方法,更新时同时记录日志表,直接在try catch 方法中添加 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
手动回滚,controller层中直接调用就可以。

  @Transactional(rollbackFor = Exception.class)
  public Boolean removeDlrList(@Param("ids") Integer[] ids,@Param("secDepartmentId")Integer secDepartmentId,@Param("logDo")LocLogDo logDo){
      try {
          if( userDao.removeDlrList(ids,secDepartmentId)>0) {
              //操作日志
              return   logDao.insert(logDo)>0;
          }else{
              return false;
          }
      } catch (Exception e) {
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
          log.error("批量移动用户异常",e);
          return false;
      }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉登的小行星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值