Spring自动事物管理失效情形

声明式事物管理虽然十分方便,但是也有失效的情形:

1.@Transactional作用在非public方法上

Spring的事物管理只支持使用public声明的方法,即使是在同一个包或者同一个类中的方法事务管理也会失效

package com.ffyc.springdemo.service;
 ​
 import com.ffyc.springdemo.dao.AdminDao;
 import com.ffyc.springdemo.model.Admin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 ​
 @Service
 ​
 public class AdminService {
 ​
     @Autowired
     AdminDao adminDao;
     @Transactional(rollbackFor = Exception.class)
      void zhuanZhang(){   //@Transactional作用在非public方法上
         adminDao.sub();
         System.out.println(10/0);
         adminDao.add();
     }adminDao.update();
     }
     
 }
 ​

2.所处方法中的异常被try catch捕获处理

若是作用方法中含有try catch语句并且捕获处理了方法中的异常,这样Spring就会无法找到异常从而导致事务管理失效

 package com.ffyc.springdemo.service;
 ​
 import com.ffyc.springdemo.dao.AdminDao;
 import com.ffyc.springdemo.model.Admin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 ​
 import java.io.UnsupportedEncodingException;
 ​
 @Service
 @Transactional(rollbackFor = Exception.class)
 public class AdminService {
 ​
     @Autowired
     AdminDao adminDao;
     public void zhuanZhang(){
         adminDao.sub();
         try {   //使用try catch捕获异常代码
             "abc".getBytes("utf-99");
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
         adminDao.add();
     }
 }
 ​

3.出现编译期异常

Spring事物管理默认只识别运行期异常,对于编译期异常Spring默认不处理,因此导致Spring事物管理失效

 package com.ffyc.springdemo.service;
 ​
 import com.ffyc.springdemo.dao.AdminDao;
 import com.ffyc.springdemo.model.Admin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 ​
 import java.io.UnsupportedEncodingException;
 ​
 @Service
 @Transactional(rollbackFor = Exception.class)
 public class AdminService {
 ​
     @Autowired
     AdminDao adminDao;
     
     public void zhuanZhang() throws UnsupportedEncodingException {
         adminDao.sub();
         "abc".getBytes("utf-99");
         adminDao.add();
     }  
 }
 ​

我们可以手动设置使Spring事务管理识别所有异常:

 @Transactional(rollbackFor = Exception.class)

我们通过设置rollback为Exception.class可以设置让Spring识别所有的异常,从而可以将任何异常都列入事务管理.

4.@Transactional事务传播行为设置错误

事务传播行为我们在下篇博客详细介绍

5.数据库引擎不支持事务管理

在MySQL中只有InnoDB引擎支持事物管理,其他的引擎均不支持事物管理,因此我们要想使用Spring的事物管理操作数据库,在MySQL中就必须保证此数据库的引擎为InnoDB引擎

 

6.同一个类中,使用非代理对象调用一个有事务管理的方法

在Spring事务管理中,我们必须使用代理对象调用另一个代理对象,否则Spring无法帮我们找到所需管理的事务

 package com.ffyc.springdemo.service;
 ​
 import com.ffyc.springdemo.dao.AdminDao;
 import com.ffyc.springdemo.model.Admin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 ​
 @Service
 ​
 public class AdminService {
 ​
     @Autowired
     AdminDao adminDao;
 ​
     public void zz(){
         this.zhuanZhang(); //使用非代理对象调用一个有事务的方法
     }
     @Transactional(rollbackFor = Exception.class)
     public void zhuanZhang(){
         adminDao.sub();
         System.out.println(10/0);
         adminDao.add();
     }
 }
 ​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会写代码的菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值