1. 程式人生 > >Transaction之坑:Spring中配置Transaction與不配置有何區別

Transaction之坑:Spring中配置Transaction與不配置有何區別

首先

Spring中 Transaction管理 配置有兩種方式:

  • Annotation式:@Transactional
  • Xml式:<tx:method />

Note:以下所有討論,都是用 @Transactional 方式來 開啟Transaction支援

問題

  1. 什麼樣的mehtod需要配置註解 @Transactional
  2. method 沒有配置註解 @Transactional, 難道 write操作 就不會被 commit

解決

  1. 事務是用來管理 insert,update,delete, 這些 write操作。如果method

    只包含read操作,不用配置@Transactional

  2. DataSource預設 配置:

    defaultAutoCommit=true;

    即:如果method不配置 @Transactional ,則每執行一個 SQL操作,如果成功,預設開啟的事務就會 立即 向資料庫自動commit,而不能rollback

  3. 如果 method 中包含一系列 write操作,為了維護 資料庫的完整性,保證成批的 SQL 語句要麼全部 commit,要麼全部 rollback。通常包含以下兩種方式:

    • BEGIN, ROLLBACK, COMMIT
      來實現,顯式地開啟並控制一個Transaction
    • 執行命令SET AUTOCOMMIT=0,用來 禁止 當前會話自動commit

    method上配置註解@Transactional,就是使用第一種方式來實現Transaction管理基於SpringAOP實現方法增強,這裡表現為TransactionAspectSupport

注意

大多數時候,我們都可以不使用Transaction管理,僅僅是對 系列 write 操作增加邏輯判斷,這也是解決 Redis事務 的常用方式,但是無奈會增加程式邏輯的複雜性。