面試突擊87:說一下 Spring 事務傳播機制?( 三 )

UserService 實現代碼:
@Servicepublic class UserService {    @Resource    private UserMapper userMapper;    @Transactional(propagation = Propagation.REQUIRES_NEW)    public int save(User user) {        System.out.println("執行 save 方法.");        return userMapper.save(user);    }}LogService 實現代碼:
@Servicepublic class LogService {    @Resource    private LogMapper logMapper;    @Transactional(propagation = Propagation.REQUIRES_NEW)    public int saveLog(String content) {        // 出現異常        int i = 10 / 0;        return logMapper.saveLog(content);    }}程序執行結果:

User 表中成功添加了一條用戶數據,Log 表執行失敗 , 沒有加入任何數據,但它并沒有影響到 UserController 中的事務執行 。
通過以上結果可以看出:LogService 中使用的是單獨的事務,雖然 LogService 中的事務執行失敗了,但并沒有影響 UserController 和 UserService 中的事務 。
NESTED 使用演示NESTED 是嵌套事務 。UserController 實現代碼如下:
@RequestMapping("/save")@Transactionalpublic Object save(User user) {    // 插入用戶操作    userService.save(user);    return true;}UserService 實現代碼如下:
@Transactional(propagation = Propagation.NESTED)public int save(User user) {    int result = userMapper.save(user);    System.out.println("執行 save 方法.");    // 插入日志    logService.saveLog("用戶插入:" + user.getName());    return result;}LogService 實現代碼如下:
@Transactional(propagation = Propagation.NESTED)public int saveLog(String content) {    // 出現異常    int i = 10 / 0;    return logMapper.saveLog(content);}最終執行結果,用戶表和日志表都沒有添加任何數據 。
執行流程描述:
  1. UserController 中調用了 UserService 的添加用戶方法,UserService 使用 NESTED 循環嵌套事務,并成功執行了添加用戶的方法 。
  2. UserService 中調用了 LogService 的添加方法 , LogService 使用了 NESTED 循環嵌套事務,但在方法執行中出現的異常 , 因此回滾了當前事務 。
  3. 因為 UserService 使用的是嵌套事務,所以發生回滾的事務是全局的,也就是說 UserService 中的添加用戶方法也被回滾了 , 最終執行結果是用戶表和日志表都沒有添加任何數據 。
總結Spring 事務傳播機制是包含多個事務的方法在相互調用時,事務是如何在這些方法間傳播的 。事務的傳播級別有 7 個,支持當前事務的:REQUIRED、SUPPORTS、MANDATORY;不支持當前事務的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事務 NESTED , 其中 REQUIRED 是默認的事務傳播級別 。
是非審之于己 , 毀譽聽之于人 , 得失安之于數 。
公眾號:Java面試真題解析
面試合集:https://gitee.com/mydb/interview
【面試突擊87:說一下 Spring 事務傳播機制?】

推薦閱讀