天天看點

事務 與 try/catch的關系

 在我們使用@Transactional事務的注解的時候,如果用到try/catch,不可避免的會出現下面的這兩種情況:

try{
    gameMapper.insertGame(game);
    int a = 6/0;
    gameMapper.findGameById(gameId);
}catch(Excetion e){
    e.printStackTrace();
}

           

這段代碼會影響事務的,因為事務預設是當發生RuntimeException的時候才能復原。是以此時即便int a = 6/0;這行代碼錯誤,還是會插入資料到資料庫表中

try{
    gameMapper.insertGame(game);
    int a = 6/0;
    gameMapper.findGameById(gameId);
}catch(Excetion e){
    e.printStackTrace();
    throw new RuntimeExcetion();
}
           

這段代碼則不會影響事務的復原,因為手動抛出了RuntimeException,是以第一行的插入資料自然也會被復原,無法生效。