国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

spring事務處理

李文鵬 / 1731人閱讀

摘要:聲明式事務管理的事務管理是通過代理實現的。其中的事務通知由元數據目前基于或注解驅動。代理對象與事務元數據結合產生了一個代理,它使用一個實現品配合,在方法調用前后實施事務。

JDBC事務
1.獲取連接 Connection con=DriverManager.getConnection();
2.開啟事務 con.setAutoCommit(true/fase);
3.執行CRUD
4.提交事務或回滾事務 con.commit()/con.rollback()
5.關閉連接 con.close();
數據庫隔離級別
隔離級別             隔離級別的值      導致的問題
Read-uncommitted       0            導致臟讀;
Read-committed         1            避免臟讀,允許不可重復讀和幻讀
Repeatable-Read        2            避免臟讀、不可重復讀,允許幻讀
Serializable           3            全部避免

臟讀:一事務對數據進行了修改,但未提交,另一事務可以讀取到未提交的數據,如果第一個事務發生了回滾,那么第二事務就讀到了。不可重復讀:一個事務中發生了兩次讀操作,第一次讀操作和第二次操作之間,另外一個事務對數據進行了修改,導致兩次讀的數據不一致。幻讀:第一個事務對一定范圍的數據進行批量修改,第二個事務在這個范圍內增加一條數據,這時候第一個事務就會丟失對新數據的修改。
spring事務的傳播性

事務傳播性就定義在多個事務同時存在的時候,spring應該如何處理這些事務的行為,以事務嵌套為例,來深入理解spring事務傳播的機制;
假設:外層事務servicea的methoda()調用內層service的methodb()若spring的級別為:propagation_required(spring的默認值)。如果serviceb.methodb()的事務級別定位為propagation_required,那么執行servicea.methoda()的時候,spring已經發起了事務,這時調用serviceb.methodb(),serviceb.methodb()看到自己已經運行在servicea.methoda()的事務內部,就不再起新的事務。假設serviceb.methodb()運行的時候發現自己沒有在事務中,他就會為自己分配一個事務。這樣,在servicea.methoda()或者serviceb.methodb()內的任何地方出現異常,事務都會被回滾。

全局事務和本地事務

所謂的全局事務也可以理解為分布式事務,也就是說程序需要處理來自不同的數據庫連接;

所謂的本地事務可以理解為應用程序不需要處理分布式的數據庫集群,只處理單一的數據源。

spring的關鍵抽象

spring事務抽象中的關鍵是,事務策略的概念,這個概念由org.springframework.transcation.PlatformTransactionManager接口定義。使用spring時,無論選擇編程式事務管理,還是聲明式事務管理,都必須定義一個正確的PlatformTransactionManager實現。舉例如下所示:


    

通過創建事務管理器,就可將應用連接到不同的事務源上。

spring使用資源同步的事務

通過配置事務管理器,我們將應用連接到了不同的事務源上,接下來我們需要直接或間接地獲取一種持久化api(jdbc等)的應用代碼,來獲取或操作資源以實現事務的同步。

spring提供了兩種解決方案,一種是高層抽象的解決方案即對所有持久化API都采用這種 模板 方法,包括 JdbcTemplate、HibernateTemplate和JdoTemplate類,另外一種是低層的解決方案,有以下這些類:DataSourceUtils(針對JDBC),SessionFactoryUtils(針對Hibernate),PersistenceManagerFactoryUtils(針對JDO)等等。

當對應用代碼來說,直接同原始持久化API特有的資源類型打交道是更好的選擇時,這些類確保應用代碼獲取到正確的Spring框架所管理的bean,事務被正確同步,處理過程中的異常被映射到一致的API。

spring聲明式事務管理

Spring的事務管理是通過AOP代理實現的。 其中的事務通知由元數據(目前基于XML或注解)驅動。 代理對象與事務元數據結合產生了一個AOP代理,它使用一個PlatformTransactionManager 實現品配合TransactionInterceptor,在方法調用前后實施事務。

舉例說明:

    // 我們想做成事務性的服務接口

    package x.y.service;
    
    public interface FooService {
    
      Foo getFoo(String fooName);
    
      Foo getFoo(String fooName, String barName);
    
      void insertFoo(Foo foo);
    
      void updateFoo(Foo foo);
    
    }
    // 上述接口的一個實現

    package x.y.service;
    
    public class DefaultFooService implements FooService {
    
      public Foo getFoo(String fooName) {
        throw new UnsupportedOperationException();
      }
    
      public Foo getFoo(String fooName, String barName) {
        throw new UnsupportedOperationException();
      }
    
      public void insertFoo(Foo foo) {
        throw new UnsupportedOperationException();
      }
    
      public void updateFoo(Foo foo) {
        throw new UnsupportedOperationException();
      }
    
    }

我們假定,FooService的前兩個方法(getFoo(String) 和getFoo(String, String))必須執行在只讀事務上下文中,其他的方法(insertFoo(Foo)和 updateFoo(Foo))必須執行在可讀寫事務上下文中。定義配置文件如下:

   
   
   
  
  
  

  
  
  
  
    
    
    
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

  
  
  
   
  
  
  

分析一下上面的配置。我們要把一個服務對象("fooService" bean)做成事務性的。 施加的事務語義封裝在定義中。 “把所有以 "get" 開頭的方法看做執行在只讀事務上下文中, 其余的方法執行在默認語義的事務上下文中”。 其中的 "transaction-manager" 屬性被設置為一個指向 PlatformTransactionManager bean的名字(這里指 "txManager"),該bean將會真正管理事務。

配置中最后一段是 的定義, 它確保由 "txAdvice" bean定義的事務通知在應用中合適的點被執行。 首先我們定義了 一個切面,它匹配 FooService 接口定義的所有操作, 我們把該切面叫做 "fooServiceOperation"。然后我們用一個通知器(advisor)把這個切面與 "txAdvice" 綁定在一起, 表示當 "fooServiceOperation" 執行時,"txAdvice" 定義的通知邏輯將被執行。
元素定義是AspectJ的切面表示法.

上面的配置將為"fooService" bean創建一個代理對象,這個代理對象被裝配了事務通知,所以當它的相應方法被調用時,一個事務將被啟動、掛起、被標記為只讀,或者其它(根據該方法所配置的事務語義)。

spring回滾

在Spring框架的事務架構里,當context的事務里的代碼拋出 Exception 時事務進行回滾。Spring框架的事務基礎架構代碼將從調用的堆棧里捕獲到任何未處理的 Exception,并將標識事務將回滾。然而,請注意Spring框架的事務基礎架構代碼將默認地只在拋出運行時和unchecked exceptions時才標識事務回滾。也就是說,當拋出一個 RuntimeException 或其子類例的實例時。(Errors 也一樣 - 默認地 - 標識事務回滾。)從事務方法中拋出的Checked exceptions將不被標識進行事務回滾。

下面的XML配置片斷里示范了如何配置一個用于回滾的checked、應用程序特定的 Exception 類型。


  
  
  
  

有時候你不想在異常拋出的時候回滾事務,就可以使用“不回滾規則”。 在下面的例子中,我們告訴Spring 框架即使遇到沒有經過處理的InstrumentNotFoundException異常,也不要回滾事務。


  
  
  
  

當Spring框架捕獲到一個異常后會檢查配置回滾規則來決定是不是要回滾事務,這時候會遵循最匹配的規則。 所以在下面這種配置中,除了InstrumentNotFoundException這種類型的異常不會導致事務回滾以外,其他任何類型的異常都會。


  
  
  

第二種方法是通過 編程式 方式來指定回滾事務。 雖然寫法非常的簡單,但是這個方法是高侵入性的,并且使你的代碼與Spring框架的事務架構高度耦合。 下面的代碼片斷里示范了Spring框架管理事務的編程式回滾:

public void resolvePosition() {
  try {
    // some business logic...
  } catch (NoProductInStockException ex) {
    // trigger rollback programmatically
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}

編程式方法的回滾對你來說是可見,如果你需要它你就可以使用,但是使用它就直接違反了在你的應用中使用一個純基于POJO的模型。

@Transactional注解

除了基于XML文件的聲明式事務配置外,你也可以采用基于注解式的事務配置方法。直接在Java源代碼中聲明事務語義的做法讓事務聲明和將受其影響的代碼距離更近了,而且一般來說不會有不恰當的耦合的風險,因為,使用事務性的代碼幾乎總是被部署在事務環境中舉例如下:

    @Transactional
    public class DefaultFooService implements FooService {
    
      Foo getFoo(String fooName);
    
      Foo getFoo(String fooName, String barName);
    
      void insertFoo(Foo foo);
    
      void updateFoo(Foo foo);
    }

當上述的POJO定義在Spring IoC容器里時,上述bean實例僅僅通過一 行xml配置就可以使它具有事務性的。如下:

    
    
    
      
      
      
    
      
      
    
      
      
      
         
      
      
      
    
    
    

@Transactional 注解可以被應用于接口定義和接口方法、類定義和類的 public 方法上。 然而,請注意只是使用 @Transactional 注解并不會啟用事務行為, 它僅僅 是一種元數據,能夠被可以識別 @Transactional 注解和上述的配置適當的具有事務行為的beans所使用。上面的例子中,其實正是 元素的出現 開啟 了事務行為。

Spring團隊的建議是你只在具體的類上使用 @Transactional 注解, 而不要注解在接口上。你當然可以在接口(或接口方法)上使用 @Transactional 注解, 但是這只有在你使用基于接口的代理時它才會生效。因為注解是 不能繼承 的, 這就意味著如果你正在使用基于類的代理時,事務的設置將不能被基于類的代理所識別,而且對象也不會被事務代理所包裝 (這是很糟糕的)。

元素上的"proxy-target-class" 屬性 控制了有什么類型的事務性代理會為使用@Transactional 來注解的類創建代理。 如果"proxy-target-class" 屬性被設為"true",那么基于類的代理就會被創建。 如果"proxy-target-class" 屬性被設為"false" 或者沒設,那么會創建基于接口的標準JDK代理。

在多數情形下,方法的事務設置將被優先執行。在下列情況下,例如: DefaultFooService 類在類的級別上被注解為只讀事務,但是,這個類中的 updateFoo(Foo) 方法的 @Transactional 注解的事務設置將優先于類級別注解的事務設置。

@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

  public Foo getFoo(String fooName) {
    // do something
  }

    // these settings have precedence for this method
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public void updateFoo(Foo foo) {
        // do something
        
    }
}

    

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70257.html

相關文章

  • 15個經典的Spring面試常見問題

    摘要:我自己總結的學習的系統知識點以及面試問題,已經開源,目前已經。目前最新的版本中模塊的組件已經被廢棄掉,同時增加了用于異步響應式處理的組件。每一次請求都會產生一個新的,該僅在當前內有效。顯而易見,這種模式存在很多問題。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://githu...

    sarva 評論0 收藏0
  • Spring Boot 參考指南(使用JTA分布式事務

    摘要:使用事務管理器是支持的一個流行的開源事務管理器實現,你可以使用啟動器向項目添加適當的依賴項,與和一樣,將自動配置并對進行后處理,以確保啟動和關閉順序是正確的。 37. 用JTA分布式事務 通過使用Atomikos或Bitronix嵌入式事務管理器,Spring Boot支持跨多個XA資源的分布式JTA事務,在部署到合適的Java EE應用服務器時也支持JTA事務。 當檢測到JTA環境時...

    silenceboy 評論0 收藏0
  • 面試分享:最全Spring事務面試考點整理

    摘要:和事務的關系關系型數據庫某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。事務的傳播特性,,,,,,強制要求要有一個物理事務。外圍事務不會被內部事務的回滾狀態影響。不支持當前事務。 Spring和事務的關系 關系型數據庫、某些消息隊列等產品或中間件稱為事務性資源,因為它們本身支持事務,也能夠處理事務。 Spring很顯然不是事務性資源,但是它可...

    graf 評論0 收藏0
  • 基于Spring中的事務管理機制

    摘要:中的事務管理分類編程式事務管理機制聲明式事務管理機制下面就銀行轉賬這一實例來講解如何利用這兩種由提供的事務處理機制來進行相應的事務處理。 什么是事務? 通俗理解,事務其實就是一系列指令的集合。 為什么要使用事務管理? 我們在實際業務場景中,經常會遇到數據頻繁修改讀取的問題。在同一時刻,不同的業務邏輯對同一個表數據進行修改,這種沖突很可能造成數據不可挽回的錯亂,所以我們需要用事務來對數據...

    SnaiLiu 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<