1. 程式人生 > >Spring Boot(四)開啟宣告式事務

Spring Boot(四)開啟宣告式事務

簡介

以前用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(); 進行手動回滾。