@Transactional注解是為方法添加事務塊的意思,使用aop的技術動態為方法添加事務范圍,在使用它時可以在類或者方法上添加,但在類上添加時需要注意一下影響的范圍。
類中添加Transactional
相當於你的每個公共的方法都會被迫加上事務,這並不是一件好事,所以不建議這樣干。
攔截器里調用的Bean
在http的攔截器里,調用了一個類,這個類是個bean,而它被添加了Transactional
注解,這相當於,你以后的每個HTTP請求都會被加上事務,這是很要命的,因為那些單表操作是不需要添加事務的。
事物傳播行為介紹
- @Transactional(propagation=Propagation.REQUIRED) :如果有事務, 那么加入事務, 沒有的話新建一個(默認情況下)
- @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個方法開啟事務
- @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
- @Transactional(propagation=Propagation.MANDATORY) :必須在一個已有的事務中執行,否則拋出異常
- @Transactional(propagation=Propagation.NEVER) :必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)
- @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
事務隔離級別
- @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數據(會出現臟讀, 不可重復讀) 基本不使用
- @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數據(會出現不可重復讀和幻讀)
- @Transactional(isolation = Isolation.REPEATABLE_READ):可重復讀(會出現幻讀)
- @Transactional(isolation = Isolation.SERIALIZABLE):串行化
完畢,對bean的事務塊使用大家要格外注意。