使用註解@Transactional,進行聲明式事務管理

基於@Transactional 註解進行聲明式事務管理的實現步驟分爲兩步:

  • 啓用聲明式事務管理,在配置類上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot項目)。
  • 將@Transactional 註解添加到合適的業務類或方法上,並設置合適的屬性信息。
    代碼示例:
@Transactional(timeout = 30,
               readOnly = false,
               isolation = Isolation.READ_COMMITTED,
               rollbackFor = Throwable.class,
               propagation = Propagation.REQUIRED)
@Service 
public class SysUserServiceImpl implements SysUserService {
@Transactional(readOnly = true)
	@Override
	public PageObject<SysUserDeptVo> findPageObjects(
			String username, Integer pageCurrent) {}
}

@Transactional註解中的屬性說明,ru上面代碼中:

  • timeout 事務的超時時間,默認值爲-1,表示沒有超時顯示。如果配置了具體時間,則超過該時間限制但事務還沒有完成,則自動回滾事務。
  • read-only 指定事務是否爲只讀事務,默認值爲 false;爲了忽略那些不需要事務的方法,比如讀取數據,可以設置 read-only 爲 true。
  • rollback-for 用於指定能夠觸發事務回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔。
  • no-rollback- for 拋出 no-rollback-for 指定的異常類型,不回滾事務。
  • isolation事務的隔離級別,默認值採用 DEFAULT。

spring中事務控制過程分析
在這裏插入圖片描述

Spring中事務傳播特性

事務傳播(Propagation)特性指"不同業務(service)對象"中的事務方法之間相互調用時,事務的傳播方式,如圖:
在這裏插入圖片描述
常用的事務傳播方式有如下兩個:

@Transactional(propagation=Propagation.REQUIRED)

       如果沒有事務創建新事務, 如果當前有事務參與當前事務, Spring 默認的事務傳播行爲是 PROPAGATION_REQUIRED,它適合於絕大多數的情況。假設 ServiveX#methodX() 都工作在事務環境下(即都被 Spring 事務增強了),假設程序中存在如下的調用鏈:
Service1#method1()->Service2#method2()->Service3#method3(),那麼這 3 個服務類的 3 個方法通過 Spring 的事務傳播機制都工作在同一個事務中。
在這裏插入圖片描述代碼:

    @Transactional(propagation = Propagation.REQUIRED)
	@Override
	public List<Node> findZtreeMenuNodes() {
		return sysMenuDao.findZtreeMenuNodes();
	}
@Transactional(propagation=Propagation.REQUIRES_NEW)

與上一個不同的是,使用該註解的必須是新事物,如果有當前事務,掛起當前事務並且開啓新事務:
在這裏插入圖片描述代碼:

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	@Override
	public void saveObject(SysLog entity) {
	  sysLogDao.insertObject(entity);
	}

Spring中事務管理總結:
       Spring 聲明式事務是 Spring 最核心,最常用的功能。由於 Spring 通過 IOC 和 AOP 的功能非常透明地實現了聲明式事務的功能。
       Spring 事務管理是基於接口代理(JDK)或動態字節碼(CGLIB)技術,然後通過 AOP 實施事務增強的。
       以DataSourceTransactionManager爲例,在DataSourceTransactionManager中,在事務開始的時候,會調用doBegin方法,首先會得到相對應的Connection,然後可以根據事務設置的需要,對Connection的相關屬性進行配置,比如將Connection的autoCommit功能關閉等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章