前面我們已經(jīng)配置好了JPA祈搜,那么為了保證數(shù)據(jù)的一致性,我們就要用到事務(wù)控制士八。
在springboot上使用事務(wù)其實很簡單容燕,就一個注解@Transactional,那么就來試試吧
首先寫個方法
@RequestMapping("/save")
@Transactional
public void save(String name,Integer age) {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new NullPointerException();
}
接著去postman執(zhí)行一下
去數(shù)據(jù)庫看下有沒有新增數(shù)據(jù)
沒有新增數(shù)據(jù)說明事務(wù)回滾婚度。我們也可以在類上直接添加注解蘸秘,那么所有的方法都進行事務(wù)的管理。
其中Spring的默認的事務(wù)規(guī)則是遇到運行異常(RuntimeException及其子類)和程序錯誤(Error)才會進行事務(wù)回滾蝗茁,當(dāng)我們遇到SQLException(檢測異常)時事務(wù)不回滾
@RequestMapping("/save")
@Transactional
public void save(String name,Integer age) throws SQLException {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("發(fā)生異常了4茁病!哮翘!");
}
數(shù)據(jù)添加了颈嚼,說明事務(wù)沒有回滾,那么我們可以使用rollbackOn屬性饭寺,表示當(dāng)該方法中拋出指定的異常時數(shù)據(jù)回滾
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age) throws SQLException {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("發(fā)生異常了W杩巍!佩研!");
}
執(zhí)行一下
數(shù)據(jù)沒有增加柑肴,說明回滾了
注解還有個屬性叫dontRollbackOn,表示當(dāng)該方法中拋出指定的異常時數(shù)據(jù)不回滾
還有在業(yè)務(wù)層捕捉異常后旬薯,發(fā)現(xiàn)事務(wù)不生效晰骑。例如
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age){
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
try {
throw new SQLException("發(fā)生異常了!!硕舆!");
} catch (Exception e){
e.printStackTrace();
}
}
執(zhí)行一下
事務(wù)沒有回滾秽荞,我們把異常統(tǒng)一拋出,例如
@RequestMapping("/save")
@Transactional(rollbackOn = Exception.class)
public void save(String name,Integer age) throws Exception {
User user = new User();
user.setAge(age);
user.setName(name);
userRepository.save(user);
throw new SQLException("發(fā)生異常了8Ч佟Q锇稀!");
}
這樣事務(wù)就回滾了
參考資料:https://blog.csdn.net/cowbin2012/article/details/90751044
其中這里rollbackFor 屬性沒有了凌节,改成了rollbackOn