天天看點

事務聲明聲明式事務和程式設計式事務差別

事務聲明聲明式事務和程式設計式事務差別

1.程式設計式事務:

所謂程式設計式事務指的是通過編碼方式實作事務,即類似于JDBC程式設計實作事務管理。管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于程式設計式事務管理,spring推薦使用TransactionTemplate。

1.聲明式事務:

管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目标方法開始之前建立或者加入一個事務,在執行完目标方法之後根據執行情況送出或者復原事務。聲明式事務最大的優點就是不需要通過程式設計的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼隻需在配置檔案中做相關的事務規則聲明,便可以将事務規則應用到業務邏輯中。

事務代碼由Spring寫好,隻需要聲明哪些方法需要事務控制和如何進行事務控制即可。顯然聲明式事務管理要優于程式設計式事務管理,這正是spring倡導的非侵入式的開發方式。

聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,隻要加上注解就可以獲得完全的事務支援。和程式設計式事務相比,聲明式事務唯一不足地方是,後者的最細粒度隻能作用到方法級别,無法做到像程式設計式事務那樣可以作用到代碼塊級别。但是即便有這樣的需求,也存在很多變通的方法,比如,可以将需要進行事務管理的代碼塊獨立為方法等等。

擴充:

Spring對程式設計式事務的支援

Spring中的事務分為實體事務和邏輯事務;

  1. 實體事務:就是底層資料庫提供的事務支援,如JDBC或JTA提供的事務;
  2. 邏輯事務:是Spring管理的事務,不同于實體事務,邏輯事務提供更豐富的控制,而且如果想得到Spring事務管理的好處,必須使用邏輯事務,是以在Spring中如果沒特别強調一般就是邏輯事務;

邏輯事務解決方案:

1. 低級别解決方案:

使用工具類擷取連接配接(會話)和釋放連接配接(會話),如使用org.springframework.jdbc.datasource包中的DataSourceUtils 類來擷取和釋放具有邏輯事務功能的連接配接。當然對內建第三方ORM架構也提供了類似的工具類,如對Hibernate提供了SessionFactoryUtils工具類,JPA的EntityManagerFactoryUtils等。

2. 進階别解決方案:

使用Spring提供的模闆類,如JdbcTemplate、HibernateTemplate和JpaTemplate模闆類等,而這些模闆類内部其實是使用了低級别解決方案中的工具類來管理連接配接或會話。

Spring提供兩種程式設計式事務支援:

直接使用PlatformTransactionManager實作和使用TransactionTemplate模闆類,用于支援邏輯事務管理。如果采用程式設計式事務推薦使用TransactionTemplate模闆類和進階别解決方案