在Spring + Mybatis的项目中,发现如下情况,processDB本来是private, 但为了Transactional 特改为public ,外部只调用 process1. 此时事务不起作用。
@Component("aclass")
public class Aclass{
@Resource(name="testDao")
private TestDao;
public void process1(){
try{
processDB();
} catch(Exception){}
}
@Transactional
public void processDB(){
testDao.insert();
testDao.get();
testDao.update();
........
}
}
后来测试后,发现 把 @Transactional 放到 process1的上面,事务就有效果了,而且 processDB 改为私有也没问题。如下:
@Component("aclass")
public class Aclass{
@Resource(name="testDao")
private TestDao testDao;
@Transactional
public void process1(){
try{
processDB();
} catch(Exception){}
}
private void processDB(){
testDao.insert();
testDao.get();
testDao.update();
........
}
}
此时又发现由于 process1中对catch拦截了,因此事务虽然生效,但是由于拦截了catch,造成异常后不回滚事务。
因为在process1中需要拦截 catch并且不抛出,结合 Transactional 似乎只在一个类的最顶层方法有效。为了解决此问题。创建了一个新类专门处理 Transactional的处理。
最终如下:
@Component("aclass")
public class Aclass{
@Resource(name="bclass")
private Bclass bclass
@Transactional
public void process1(){
try{
bclass.processDB();
} catch(Exception){}
}
}
@Component("bclass")
public class Bclass{
@Resource(name="testDao")
private TestDao testDao
@Transactional
public void processDB(){
testDao.insert();
testDao.get();
testDao.update();
........
}
}
注解@Transactional 不起作用的非配置问题
最新推荐文章于 2023-03-17 13:05:23 发布