註解@Transactional 不起作用的非配置問題
在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();
........
}
}