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事務再次讀取這條數據以後,獲取到的結果與第一次讀到的不一致。(讀取到的數據不一致)
事務完成操做以前,不容許其餘事務進行操做,可避免