一、什么是事務
? ? 1、概念:把一組業務當成一個業務來做,要么都成功,要么都不成功,是保證業務操作完整行的一種數據庫機制。
? ? 2、種類:在事務控制方面主要有兩個分類。
? ? ? ? 1、編程式事務:在代碼中直接加入處理事務的邏輯,可能需要在代碼中調試一些事務管理的相關方法。
? ? ? ? 2、聲明式事務:在方法的外部添加注解或者直接在配置文件中定義,將事務管理代碼從業務中分離處理,以聲明的方式實現食物管理。Spring 的AOP就可以實現該功能:事務管理代碼的固定模式作為一種橫切關注點,通過AOP方法模塊化,進而實現聲明式事務。
? ? 3、聲明式事務的特性:ACID
? ? ? ? A原子性:一個事務中的所有操作,要么都成功,要么都失敗,不會結束在中間的某個環節。事務執行過程中發生錯誤,會被回滾到食物開始前的狀態,就像這個事務沒有執行過一樣。即:事務不可再分,不可約簡。
? ? ????C一致性:在事務開始之前和結束之后,數據庫的完整性沒有被破壞,保證數據的一致性。
? ? ? ? I 隔離性:在并發的情況下,事務之間要相互隔離,防止多個事務兵法之行時由于交叉執行而導致的數據不一致情況,事務的隔離級別有四個,下面會詳細介紹。
? ? ? ? D持久性:數據處理結束后,對數據的修改就是永久性的,即便系統故障也不會丟失。
二、怎么實現聲明式事務
? ? 1、聲明式事務配置介紹
? ? ? ? 1)Spring從不同的事務管理API中抽出了一整套食物管理機制,讓食物管理代碼從特定的食物技術中獨立出來。開發人員通過配置的方式進行食物管理,而不必了解底層是如何實現的。
? ? ? ? Spring的核心食物管理抽象是PlatformTransactionManager。它為事務管理封裝了一組獨立于技術的方法。無論使用Spring的哪種事務(編程式、聲明式),事務管理器都是必須的。
? ? ? ? 事務管理器可以以普通的bean形式聲明在Spring IOC容器中。
? ? 2)Spring提供的事務管理器
? ? 配置文件中配置
<!‐‐事務控制‐‐>
?<!‐‐配置事務管理器的bean‐‐>
?<bean id="transactionManager" class="org.springframework.jdbc.datasourc e.DataSourceTransactionManager">
????????<property name="dataSource" ref="dataSource"></property>
?</bean>
?<!‐‐開啟基于注解的事務控制模式,依賴tx名稱空間‐‐>
?<tx:annotation‐driven transaction‐manager="transactionManager"></tx:annotation‐driven>??
????注:使用該標簽的時候,一定要注意依賴的是tx名稱空間的引用。
? ? 配置好之后,需要配合注解@Transactional注解使用。
? ??@Transactional可以標記在類上,也可以標記在方法上。標記在類上時代表該類下的所有方法都運用上了事務;當標記在方法上時,則只是當前方法運用事務。當然也可以同時存在與類和方法上,這種情況以方法上的為準,如果方法上沒有注解,則以類上的為準。
? ? 雖然@Transactional直接加在類上是更省事的,但是并不建議這么使用,寫在方法上面控制的粒度更細,避免不必要的問題出現,影響開發效率。同時,@Transactional一般會存在于業務邏輯層中,在絕大多數情況下,只有業務邏輯層才會出現嵌套調用的情況。
? ? 2、事務配置的屬性
????????isolation:設置事務的隔離級別
????????propagation:事務的傳播行為
????????noRollbackFor:那些異常事務可以不回滾? ? ? ? ????????
????????noRollbackForClassName:填寫的參數是全類名
????????rollbackFor:哪些異常事務需要回滾
????????rollbackForClassName:填寫的參數是全類名
? ? ? ? readOnly:設置事務是否為只讀事務
????????timeout:事務超出指定執行時長后自動終止并回滾,單位是秒。
? ? ? ? 1)設置隔離級別
? ? ? ? ? ? 解決什么問題:在并發(同一時間,多個線程同時進行請求)情況下,對同一個數據進行讀寫操作時產生的問題。
? ? ? ? 會產生的問題:
? ? ? ? ? ? a)臟讀:表示一個事物能夠讀取到另一個事物中還未提交的數據。比如:某事物嘗試插入記錄A,此時該食物還未提交,然后另一個事務就讀取到了記錄A。
? ? ? ? ? ? b)不可重復讀:是指在一個事務內,多次讀同一個數據,但讀取到的結果不一樣,會在本市無中產生數據不一致的問題。
? ? ? ? ? ? c)幻讀:指同一個事物內多次查詢返回的結果集不一樣。比如同一個事務A第一次查詢時候有n條記錄,但是第二次同等條件下查詢就有m條數據了,這就好像產生了幻覺。發生幻讀的原因也是另一個事務新增或者刪除或者修改了第一個事務結果集里面的數據,同一個記錄的數據內容被修改了,所有數據行的記錄就變多或者變少了。
? ? ? ? 解決方式(也就是事務隔離級別):
? ? ? ? ? ? 未提交讀(READ-UNCOMMITTED):最低隔離級別,事務未提交之前,就可以被其他食物讀取到,可能產生:臟讀、幻讀、不可重復讀。
? ? ? ? ? ? 已提交讀(READ-COMMITTED):一個事務提交后才能被其他事務讀取到,會造成幻讀、不可重復讀,能解決臟讀問題。
? ? ? ? ? ? 可重復讀(REPEATABLE-READ):默認隔離級別,保證多次讀取同一數據時,其值都和事務開始時候的內容是一致的,禁止讀取到別的食物為提交的數據,也會造成幻讀,可以解決臟讀和不可重復讀。
? ? ? ? ? ? 序列化(SERIALIZABLE):代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀。
? ? 注:不可重復讀和幻讀詩有些相似的,區別在于前者只需要鎖行,后者需要鎖表,大家不要弄混了哦。
三、為什么要使用事務
? ? 首先,Spring時通過AOP對事務進行管理的,當在數據庫執行多步操作時,其中一步出現數據異常時通過事務之行回滾,事務不是必須使用的,這取決于項目是需不需要做事務控制,當然,在大多數企業級項目中,都是需要的哈。他也是維護數據安全性的一種方式,像是在銀行的項目中的轉賬服務,事務就是至關重要的,需要他的護航,避免金錢交易出現錯差。