Spring Boot(四)開啟宣告式事務
阿新 • • 發佈:2018-11-08
簡介
以前用Spring想要用事務的時候,都需要自己在spring的配置檔案中配置事務管理器。而Spring Boot則預設對jpa,jdbc,mybatis開啟了事務,引入他們的依賴的時候,事務就開啟了。使用事務只需要一個@Transactional註解就可以了。
準備
以上一篇文章【Spring Boot(三)整合MyBatis,Mybatis Generator】為例,演示事務的使用。
修改程式碼
在IUserService.java中新增增加員工的方法
public interface IUserService { User get(Integer id); User insert(User user) throws Exception; }
在UserServiceImpl.java中實現該方法
@Service("iUserService") public class UserServiceImpl implements IUserService { @Autowired private UserMapper userMapper; @Override public User get(Integer id) { return userMapper.selectByPrimaryKey(id); } @Override @Transactional public User insert(User user) throws Exception{ userMapper.insert(user); throw new RuntimeException(); } }
在Controller中新增插入使用者的方法
@RestController public class UserController { @Autowired private IUserService iUserService; @GetMapping("/get_user/{userId}") public User getUser(@PathVariable("userId") Integer userId){ User user =iUserService.get(userId); return user; } @PostMapping("/add_user") public String addUser(User user){ try { iUserService.insert(user); return "插入成功"; } catch (Exception e) { e.printStackTrace(); return "插入失敗"; } } }
測試
這裡,在UserServiceImpl的insert方法中使用了@Transactional註解開啟事務。方法體中丟擲一個執行時異常,所以客戶端呼叫add_user方法時,不會插入資料到資料庫。
常見問題
1、spring事務預設的事務規則是對執行時異常(RuntimeException)和程式錯誤(Error)才會回滾。如果針對非檢測異常進行事務回滾,則可以在@Transactional中設定rollbackFor屬性宣告指定回滾異常:
@Override
@Transactional(rollbackFor = Exception.class)
public User insert(User user) throws Exception{
userMapper.insert(user);
throw new SQLException("發生了sql異常");
}
2、如果在業務層的異常被捕獲了,則不會觸發事務回滾。可以在異常中使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 進行手動回滾。