1. 程式人生 > >Spring Boot入門系列(十三)如何實現事務

Spring Boot入門系列(十三)如何實現事務

前面介紹了Spring Boot 中的整合Mybatis並實現增刪改查。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。

Spring Boot 整合完Mybatis,有個特別重要的功能之前忘記講了:那就是Spring Boot如何實現事物控制。在我們的實際系統中,事務會被經常用到。特別是資料庫操作或者是複雜的業務操作時,必須事物執行。必須保證本次業務的處理結果更改要麼都成功,要麼都失敗。那麼這種場景下,我們改如何實現呢?

 

為什麼要事務

以轉賬業務為例:一次轉載業務涉及資料庫表的兩次更改。為確保業務完整性,需保證這兩次更改要麼都成功,要麼都失敗。否則賬戶金額就做了,後果非常嚴重。

 

事務播行為

Propagation.REQUIRED -- 支援當前事務,如果當前沒有事務,就新建一個事務,最常見的選擇。
Propagation.SUPPORTS -- 支援當前事務,如果當前沒有事務,就以非事務方式執行
Propagation.MANDATORY -- 支援當前事務,如果當前沒有事務,就丟擲異常。
Propagation.REQUIRES_NEW -- 新建事務,如果當前存在事務,把當前事務掛起, 兩個事務之間沒有關係,一個異常,一個提交,不會同時回滾。
Propagation.NOT_SUPPORTED -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
Propagation.NEVER -- 以非事務方式執行,如果當前存在事務,則丟擲異常

如何實現

1、首先建立Spring Boot專案,並整合Mybatis相關的依賴。這個之前的文章講過,大家可以看我這篇文章:《Spring Boot入門系列(六)Spring Boot如何整合Mybatis【附詳細步驟】》

2、在需要事務的方法上新增 @Transactional註解,並通過propagation指定事務機制。

修改UserServiceImpl 類和UserService類,增加 saveUserTransactional 方法。

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveUserTransactional(SysUser user) {

        userMapper.insert(user);

        int a = 1 / 0;

        user.setIsDelete(1);
        userMapper.updateByPrimaryKeySelective(user);
    }

說明:

  • propagation = Propagation.REQUIRED是預設的事務機制,若當前有事務則支援當前事務,否則新建事務。
  • springboot 開啟事物很簡單,只需要加註解@Transactional即可。
  • @Transactional也可以加在類上,則該類所有方法都遵循該註解配置。

 3、測試呼叫

在之前的MyBatisCRUDController增加測試方法:saveUserTransactional。

    @RequestMapping("/saveUserTransactional")
    public JSONResult saveUserTransactional() {

        String userId = sid.nextShort();

        SysUser user = new SysUser();
        user.setId(userId);
        user.setUsername("weiz" + new Date());
        user.setNickname("weiz" + new Date());
        user.setPassword("abc123");
        user.setIsDelete(0);
        user.setRegistTime(new Date());

        userService.saveUserTransactional(user);

        return JSONResult.ok("儲存成功");
    }

 

測試

首先我們看目前的sql資料中的資料,user表中資料如下:

 

 在瀏覽器中資料:http://localhost:8080/mybatis/saveUserTransactional,也沒返回執行異常,資料庫中的資料也沒有變化,說明資料已經回滾了:

 

 

最後

以上,就把Spring Boot中事物控制講完了,是不是特別簡單。

這個系列課程的完整原始碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回覆:springboot原始碼。獲取這個系列課程的完整原始碼。

&n