事務註解 @Transactional

一、當標於類前時, 標示類中全部方法都進行事務處理java

@Transactional public class TestServiceBean implements TestService {
   ...
}

某些方法不須要事務時spring

事務傳播行爲數據庫

@Transactional(propagation=Propagation.REQUIRED) :code

  • 若是有事務, 那麼加入事務, 沒有的話新建一個(默認狀況下)

@Transactional(propagation=Propagation.NOT_SUPPORTED) :blog

  • 容器不爲這個方法開啓事務

@Transactional(propagation=Propagation.REQUIRES_NEW) :接口

  • 無論是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務

@Transactional(propagation=Propagation.MANDATORY) :事務

  • 必須在一個已有的事務中執行,不然拋出異常

@Transactional(propagation=Propagation.NEVER) :io

  • 必須在一個沒有的事務中執行,不然拋出異常(與Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS) :class

  • 若是其餘bean調用這個方法,在其餘bean中聲明事務,那就用事務.若是其餘bean沒有聲明事務,那就不用事務

事務超時設置容器

  • @Transactional(timeout=30) //默認是30秒

事務隔離級別

  • @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數據(會出現髒讀, 不可重複讀) 基本不使用
  • @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數據(會出現不可重複讀和幻讀)
  • @Transactional(isolation = Isolation.REPEATABLE_READ):可重複讀(會出現幻讀)
  • @Transactional(isolation = Isolation.SERIALIZABLE):串行化

注意的幾點

  1. @Transactional 只能被應用到public方法上, 對於其它非public的方法,若是標記了@Transactional也不會報錯,但方法沒有事務功能
  2. 用 spring 事務管理器,由spring來負責數據庫的打開,提交,回滾;遇到不受檢查(unchecked)的例外時回滾
  3. @Transactional 註解應該只被應用到 public 可見度的方法上
  4. @Transactional 註解能夠被應用於接口定義和接口方法、類定義和類的 public 方法上
  5. Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 註解,而不要使用在類所要實現的任何接口上
相關文章
相關標籤/搜索