Spring學習【四】事務管理

事務管理

編程式事務spring

  • 經過編碼方式實現事務,須要在每一個執行的業務方式獨立實現。實現方式可經過內部匿名類實現。

聲明式事務數據庫

  • 聲明式事務基於 AOP,將具體業務邏輯與事務處理解耦。聲明式事務有兩種方式,一種是在配置文件(xml)中作相關的事務規則聲明,另外一種是基於@Transactional 註解的方式

編程式事務

transactionTemplate.execute(new TransactionCallback() { 
public Object doInTransaction(TransactionStatus status) { 
try{ 
    } 
catch (Exception e) { 
} 
  finally { 

status.setRollbackOnly(); 
           ) 
);

聲明式事務

xml配置編程

<!-- 事務管理配置 -->
    <bean id="springTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven proxy-target-class="true" transaction-manager="springTransactionManager"/>

添加【@Transaction】註解到相關方法服務器

屬性名 說明
name 當在配置文件中有多個 TransactionManager , 能夠用該屬性指定選擇哪一個事務管理器。
propagation 事務的傳播行爲,默認值爲 REQUIRED。
isolation 事務的隔離度,默認值採用 DEFAULT。
timeout 事務的超時時間,默認值爲-1。若是超過該時間限制但事務尚未完成,則自動回滾事務。
read-only 指定事務是否爲只讀事務,默認值爲 false;爲了忽略那些不須要事務的方法,好比讀取數據,能夠設置 read-only 爲 true。
rollback-for 用於指定可以觸發事務回滾的異常類型,若是有多個異常類型須要指定,各種型之間能夠經過逗號分隔。
no-rollback- for 拋出 no-rollback-for 指定的異常類型,不回滾事務。

Transaction的事務傳播行爲

PROPAGATION_REQUIRED併發

  • 支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。

PROPAGATION_SUPPORTS框架

  • 支持當前事務,若是當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY性能

  • 支持當前事務,若是當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW編碼

  • 新建事務,若是當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED.net

  • 以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。

PROPAGATION_NEVERcode

  • 以非事務方式執行,若是當前存在事務,則拋出異常。

isolation

DEFAULT

  • 使用數據庫設置的隔離級別 ( 默認 ) ,由 DBA 默認的設置來決定隔離級別 .

READ_UNCOMMITTED

  • 會出現髒讀、不可重複讀、幻讀 ( 隔離級別最低,併發性能高 )

READ_COMMITTED

  • 會出現不可重複讀、幻讀問題(鎖定正在讀取的行)

REPEATABLE_READ

  • 會出幻讀(鎖定所讀取的全部行)

SERIALIZABLE

  • 保證全部的狀況不會發生(鎖表)

注意

正確的設置@Transactional 的 rollbackFor 屬性

  • 默認狀況下,若是在事務中拋出了未檢查異常(繼承自 RuntimeException 的異常)或者 Error,則 Spring 將回滾事務;除此以外,Spring 不會回滾事務。除非經過【rollbackFor】指定回滾異常

@Transactional 只能應用到 public 方法纔有效

避免 Spring 的 AOP 的自調用問題

  • 若同一類中的其餘沒有@Transactional註解的方法內部調用有@Transactional 註解的方法,有@Transactional註解的方法的事務被忽略,不會發生回滾。
  • 例:
@Service
public class OrderService {
    private void insert() {
insertOrder();
}
@Transactional
    public void insertOrder() {
        //insert log info
        //insertOrder
        //updateAccount
    }
}

JDBC和JTA事務區別

JDBC事務

  • 單庫的事務,實際在與JDBC connection中實現。只侷限於JDBC connection的生命週期。

JTA事務

  • 多庫的事務。JTA(Java Transaction API)提供了跨數據庫鏈接(或其餘JTA資源)的事務管理能力。JTA事務管理則由JTA容器實現,J2ee框架中事務管理器與應用程序,資源管理器,以及應用服務器之間的事務通信。
相關文章
相關標籤/搜索