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();
     }
 }
 ​

猜你喜欢

转载自blog.csdn.net/weixin_52629592/article/details/128908336