Spring事務管理&數據庫隔離級別

 

1、spring事務管理spring

一、 什麼是事務數據庫

  事務(Transaction)是多個操做數據庫的步驟(CRUD)的集合,是併發控制的單位,是用戶定義的一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。達到保持數據完整性的做用。express

 

二、 事務特色編程

  1)  原子性mybatis

  一個事務全部對數據庫操做是一個最小單位,不可細分;要麼執行,要麼不執行併發

  2)  隔離性編碼

  事務之間能夠同時執行,不會互相干擾,是隔離的spa

  3)  一致性.net

  事務執行成功數據庫變動,事務執行失敗數據庫不變動,即事務一致性代理

  4)  持久性

  事務執行成功,以後的結果是持久的,一直保持

 

三、 事務配置方式

  1)  編程式事務

  編程式事務指的是經過編碼方式實現事務,須要配置文件添加配置,而且在編碼中也須要配置,如今使用愈來愈少

  2)  聲明式事務

  創建在AOP之上的。對方法先後進行攔截,而後在目標方法開始以前建立或者加入一個事務,在執行完目標方法以後根據執行狀況提交或者回滾事務;聲明式事務配置通常有五種(abcde),兩種配置方式較爲經常使用:我喜歡用第一種

    a)         使用AOP的方式實現事務配置

       

 

                      i.     aop:pointcut標籤配置參與事務的類,因爲是在Service中進行數據庫業務操做,配的應該是包含那些做爲事務的方法的Service類。

         首先應該特別注意的是id的命名,一樣因爲每一個模塊都有本身事務切面,因此我以爲初步的命名規則由於 all+模塊名+ServiceMethod。並且每一個模塊之間不一樣之處還在於如下一句:

         expression="execution(* com.test.testAda.test.model.service.*.*(..))"

             其中第一個*表明返回值,第二*表明service下子包,第三個*表明方法名,「(..)」表明方法參數。

                      ii.   aop:advisor標籤主要將事務屬性配置和開啓事務類進行關聯

                      iii.    tx:attributes標籤主要是配置事務的方法屬性類型,name=add*中表示事務中全部以add開頭的方法。

    b)         註解式配置

                      i.    Spring-mybatis

       

                      ii.  Spring-hibernata

       

                      iii.   注意@Transaction註解的使用

        這個註解只能使用在public方法上,別的不會報錯,可是沒有效果;若是這個註解放在類上,類裏面的全部public方法都會有效。

                     iv.   全註解的使用方式

       

 

                      v.   註解中屬性詳解

        Propagation是傳播屬性,REQUIRED表明使用當前開啓事務;rollbackFor=Exception.class表明出現異常回滾,能夠指定多個異常;

        Timeout =1 事務的超時性;

        Isolation表明事務隔離級別,上面的是默認;

        配置readOnly=true表示當前事務爲只讀事務,若是爲false爲可讀寫,默認是false。

                     vi.   註解位置

        註解最好放在具體的類或者方法上,不要放在接口上,由於註解不具備繼承性,因此若是讀取不到註解信息,將不會讀取到相應對象二進行事務配置。

    c)  每一個bean都有一個代理

      https://blog.csdn.net/hjm4702192/article/details/17277669

    d)  全部bean共享一個代理基類

      https://blog.csdn.net/hjm4702192/article/details/17277669

    e)  使用攔截器

      https://blog.csdn.net/hjm4702192/article/details/17277669

四、 事務隔離級別

  事務隔離級別指的是多個併發事務之間的隔離程度

  1)  ISOLATION_DEFAULT

    此種隔離級別是事務管理默認配置的,使用數據庫的默認隔離級別,上面的配置中就是使用此種級別,下面的四種級別與jdbc的相對應。

  2)  ISOLATION_READ_UNCOMMITTED

    未提交讀。容許其餘事務能夠看到本事務未提交的數據,可形成髒讀、幻讀和不可重複讀

  3)  ISOLATION_READ_COMMITTED

    提交讀。其餘事務只能讀取到本事務提交後的數據,本事務不提交,其餘事務沒法讀取到本事務數據,可防止髒讀,可能出現幻讀和不可重複讀

  4)  ISOLATION_REPEATABLE_READ

    可重複度。保證事務不提交就不會讀取到其數據,防止髒讀和不可重複讀,可能發生幻讀

  5)  ISOLATION_SERIALIZABLE

    可串行化。犧牲效率順序執行事物,若是事物執行異常,其餘事務阻塞。防止髒讀,幻讀和不可重複。

五、 事務傳播屬性

  1)  PROPAGATION_REQUIRED

    使用當前事務,若是當前無事務,新建一個事務

  2)  PROPAGATION_SUPPORTS

    使用當前事務,若是當前無事務,使用非事務方式執行

  3)  PROPAGATION_MANDATORY

    使用當前事務,若是當前無事務,拋出異常

  4)  PROPAGATION_REQUIRES_NEW

    每次執行新建事務,若是當前存在事務,將當前事務掛起

  5)  PROPAGATION_NOT_SUPPORTED

    以非事務方式執行,若是當前存在事務,將當前事務掛起

  6)  PROPAGATION_NEVER

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

  7)  PROPAGATION_NESTED

    嵌套類事務,若是當前存在事務,則在當前事務內新建事務並執行,若是當前無事務,與第一條一樣方式執行

2、數據庫隔離級別

         一、未提交讀

    (Read Uncommitted):容許髒讀,也就是可能讀取到其餘會話中未提交事務修改的數據

         二、提交讀

    (Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重複讀)

         三、可重複度

    (Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,可是還存在幻象讀

         四、可串行化

               (Serializable):徹底串行化的讀,每次讀都須要得到表級共享鎖,讀寫相互都會阻塞

3、數據異常

         一、髒讀

               A事務正在添加zhangsan信息,可是還沒提交,數據庫就已經能讀取到張三信息。

         二、幻讀

    多個事務同時修改同一條記錄,事務之間不知道彼此存在,當事務提交以後,後面的事務修改的數據將會覆蓋前事務,前一個事務就像發生幻覺同樣

                   例如:同時修改某行數據

          事務A將姓名字段修改成zhangsan,

                              事務B將姓名字段修改成lisi

                              事務提交,事務B將覆蓋A數據,也就是zhangsan丟失。                

         三、不可重複讀

              在A事務中,兩次讀取同一個數據,在A事務第一次讀取數據以後,B事務修改這條數據,當A事務再次讀取這條數據以後,獲取到的結果與第一次讀到的不一致。(讀取到的數據不一致)

 

 

       事務完成操做以前,不容許其餘事務進行操做,可避免

相關文章
相關標籤/搜索