真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring框架之九陰真經(jīng)

Chapter One . Spring 事務(wù)配置

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比六安網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式六安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋六安地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。


1.事務(wù)(Transaction)是并發(fā)控制的單位,是用戶定義的一個操作序列。

   這些操作要么都做,要么都不做,是一個不可分割的工作單位。通過事務(wù),SQL Server能將邏輯相關(guān)的一組操作綁定在一起,以便服務(wù)器保持數(shù)據(jù)的完整性。

事務(wù)通常是以Begin,Transaction 開始,以Commit或Rollback結(jié)束。

Commit:表示提交,即提交事務(wù)的所有操作。具體地說就是將事務(wù)中所有對數(shù)據(jù)庫的更新寫回到磁盤上的物理數(shù)據(jù)庫中去,事務(wù)正常結(jié)束。

Rollback:表示回滾,即在事務(wù)運行的過程中發(fā)生了某種故障,事務(wù)不能繼續(xù)進行,系統(tǒng)將事務(wù)中對數(shù)據(jù)庫的所有以完成的操作全部撤消,滾回到事務(wù)開始的狀態(tài)。

2.事務(wù)的特性(ACID特性)

A:原子性(Atomicity) 事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中包括的諸操作要么全做,要么全不做。

C:一致性(Consistency) 事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性是密切相關(guān)的。

I:隔離性(Isolation) 一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。

D:持續(xù)性/永久性(Durability) 一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應該是永久性的。

3. 分為編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。

編程式事務(wù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務(wù)管理,spring推薦使用TransactionTemplate。

聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是對方法前后進行攔截,然后在目標方法開始之前創(chuàng)建或者加入一個事務(wù),在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)最大的優(yōu)點就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過基于@Transactional注解的方式),便可以將事務(wù)規(guī)則應用到業(yè)務(wù)邏輯中。

       顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,這正是spring倡導的非侵入式的開發(fā)方式。聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務(wù)支持。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,后者的最細粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務(wù)管理的代碼塊獨立為方法等等。

         聲明式事務(wù)管理也有兩種常用的方式,一種是基于tx和aop名字空間的xml配置文件,另一種就是基于@Transactional注解。顯然基于注解的方式更簡單易用,更清爽。

spring事務(wù)特性

spring所有的事務(wù)管理策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口

其中TransactionDefinition接口定義以下特性:

事務(wù)隔離級別

  隔離級別是指若干個并發(fā)的事務(wù)之間的隔離程度。

  TransactionDefinition 接口中定義了五個表示隔離級別的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數(shù)據(jù)庫的默認隔離級別。對大部分數(shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務(wù)可以讀取另一個事務(wù)修改但還沒有提交的數(shù)據(jù)。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上并沒有此級別。

  • TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù)。該級別可以防止臟讀,這也是大多數(shù)情況下的推薦值。

  • TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務(wù)在整個過程中可以多次重復執(zhí)行某個查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。

  • TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

事務(wù)傳播行為

      所謂事務(wù)的傳播行為是指,如果在開始當前事務(wù)之前,一個事務(wù)上下文已經(jīng)存在,此時有若干選項可以指定一個事務(wù)性方法的執(zhí)行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。這是默認值。

  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個新的事務(wù),如果當前存在事務(wù),則把當前事務(wù)掛起。

  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行。

  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運行,如果當前存在事務(wù),則把當前事務(wù)掛起。

  • TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運行,如果當前存在事務(wù),則拋出異常。

  • TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則拋出異常。

  • TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務(wù),則創(chuàng)建一個事務(wù)作為當前事務(wù)的嵌套事務(wù)來運行;如果當前沒有事務(wù),則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

事務(wù)超時:所謂事務(wù)超時,就是指一個事務(wù)所允許執(zhí)行的最長時間,如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。

  默認設(shè)置為底層事務(wù)系統(tǒng)的超時值,如果底層數(shù)據(jù)庫事務(wù)系統(tǒng)沒有設(shè)置超時值,那么就是none,沒有超時限制。

事務(wù)只讀屬性:只讀事務(wù)用于客戶代碼只讀但不修改數(shù)據(jù)的情形,只讀事務(wù)用于特定情景下的優(yōu)化,比如使用Hibernate的時候。

默認為讀寫事務(wù)。

        “只讀事務(wù)”并不是一個強制選項,它只是一個“暗示”,提示數(shù)據(jù)庫驅(qū)動程序和數(shù)據(jù)庫系統(tǒng),這個事務(wù)并不包含更改數(shù)據(jù)的操作,那么JDBC驅(qū)動程序和數(shù)據(jù)庫就有可能根據(jù)這種情況對該事務(wù)進行一些特定的優(yōu)化,比方說不安排相應的數(shù)據(jù)庫鎖,以減輕事務(wù)對數(shù)據(jù)庫的壓力,畢竟事務(wù)也是要消耗數(shù)據(jù)庫的資源的。 

但是你非要在“只讀事務(wù)”里面修改數(shù)據(jù),也并非不可以,只不過對于數(shù)據(jù)一致性的保護不像“讀寫事務(wù)”那樣保險而已。 

因此,“只讀事務(wù)”僅僅是一個性能優(yōu)化的推薦配置而已,并非強制你要這樣做不可


spring事務(wù)回滾規(guī)則

     指示spring事務(wù)管理器回滾一個事務(wù)的推薦方法是在當前事務(wù)的上下文內(nèi)拋出異常。spring事務(wù)管理器會捕捉任何未處理的異常,然后依據(jù)規(guī)則決定是否回滾拋出異常的事務(wù)。

        默認配置下,spring只有在拋出的異常為運行時unchecked異常時才回滾該事務(wù),也就是拋出的異常為RuntimeException的子類(Errors也會導致事務(wù)回滾),而拋出checked異常則不會導致事務(wù)回滾??梢悦鞔_的配置在拋出那些異常時回滾事務(wù),包括checked異常。也可以明確定義那些異常拋出時不回滾事務(wù)。還可以編程性的通過setRollbackOnly()方法來指示一個事務(wù)必須回滾,在調(diào)用完setRollbackOnly()后你所能執(zhí)行的唯一操作就是回滾。


  • myBatis為例   基于注解的聲明式事務(wù)管理配置@Transactional

spring.xml

   

  
      
          
          
            classpath:mybatis-config.xml  
          
      
      
      
      
          
              
                com.baobao.persistence.test  
              
          
          
      
      
      
      
          
      
      
      
    

添加tx名字空間

xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"  
xsi:schemaLocation="http://www.springframework.org/schema/aop 
                    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
                http://www.springframework.org/schema/tx 
                http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"


        MyBatis自動參與到spring事務(wù)管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數(shù)據(jù)源與DataSourceTransactionManager引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會不起作用。

@Transactional注解

@Transactional屬性 

屬性類型描述
valueString可選的限定描述符,指定使用的事務(wù)管理器
propagationenum: Propagation可選的事務(wù)傳播行為設(shè)置
isolationenum: Isolation可選的事務(wù)隔離級別設(shè)置
readOnlyboolean讀寫或只讀事務(wù),默認讀寫
timeoutint (in seconds granularity)事務(wù)超時時間設(shè)置
rollbackForClass對象數(shù)組,必須繼承自Throwable導致事務(wù)回滾的異常類數(shù)組
rollbackForClassName類名數(shù)組,必須繼承自Throwable導致事務(wù)回滾的異常類名字數(shù)組
noRollbackForClass對象數(shù)組,必須繼承自Throwable不會導致事務(wù)回滾的異常類數(shù)組
noRollbackForClassName類名數(shù)組,必須繼承自Throwable不會導致事務(wù)回滾的異常類名字數(shù)組

用法

       @Transactional 可以作用于接口、接口方法、類以及類方法上。當作用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時,我們也可以在方法級別使用該標注來覆蓋類級別的定義。

         雖然 @Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基于接口的代理時它才會生效。另外, @Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質(zhì)決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。

        默認情況下,只有來自外部的方法調(diào)用才會被AOP代理捕獲,也就是,類內(nèi)部方法調(diào)用本類內(nèi)部的其他方法并不會引起事務(wù)行為,即使被調(diào)用方法使用@Transactional注解進行修飾。

@Autowired  
private MyBatisDao dao;  
  
@Transactional  
@Override  
public void insert(Test test) {  
    dao.insert(test);  
    throw new RuntimeException("test");//拋出unchecked異常,觸發(fā)事物,回滾  
}

noRollbackFor類,當作用于類上時,該類的所有 public 方法將都具有該類型的事務(wù)屬性

@Transactional(noRollbackFor=RuntimeException.class)  
    @Override  
    public void insert(Test test) {  
        dao.insert(test);  
        //拋出unchecked異常,觸發(fā)事物,noRollbackFor=RuntimeException.class,不回滾  
        throw new RuntimeException("test");  
    } 
    
    
    @Transactional  
public class MyBatisServiceImpl implements MyBatisService {  
  
    @Autowired  
    private MyBatisDao dao;  
      
      
    @Override  
    public void insert(Test test) {  
        dao.insert(test);  
        //拋出unchecked異常,觸發(fā)事物,回滾  
        throw new RuntimeException("test");  
    }


propagation=Propagation.NOT_SUPPORTED

@Transactional(propagation=Propagation.NOT_SUPPORTED)  
@Override  
public void insert(Test test) {  
    //事物傳播行為是PROPAGATION_NOT_SUPPORTED,以非事務(wù)方式運行,不會存入數(shù)據(jù)庫  
    dao.insert(test);  
}
  • myBatis為例   基于注解的聲明式事務(wù)管理配置,xml配置

主要為aop切面配置,只看xml就可以了

  
  
      
          
          
      
  
  
  
      
      

 


Chapter Two  Spring事務(wù)配置的方式


Spring 框架之九陰真經(jīng)

    根據(jù)代理機制的不同,總結(jié)了五種Spring事務(wù)的配置方式,配置文件如下:

    第一種方式:每個Bean都有一個代理




      
          
        
      

      
    
        
    
    
    
    
        
    
    
      
             
                
          
         
          
          
              
                PROPAGATION_REQUIRED
              
          
      

    第二種方式:所有Bean共享一個代理基類




      
          
        
      

      
    
        
    
    
      
          
          
          
          
              
                PROPAGATION_REQUIRED  
              
          
        
   
    
    
        
    
    
      
           
    

第三種方式:使用攔截器




      
          
        
      

      
    
        
     
   
      
          
          
          
              
                PROPAGATION_REQUIRED  
              
          
    
      
      
          
              
                *Dao
              
          
          
              
                transactionInterceptor  
              
          
      
  
    
    
        
    

第四種方式:使用tx標簽配置的攔截器




    
    

      
          
        
      

      
    
        
    

    
        
            
        
    
    
    
        
                
          
第五種方式:全注解



    
    

    

      
          
        
      

      
    
        
    
    

此時在DAO上需加上@Transactional注解,如下:
package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public List listUsers() {
        return this.getSession().createQuery("from User").list();
    }
    
    
}




新聞標題:Spring框架之九陰真經(jīng)
標題來源:http://weahome.cn/article/iehsdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部