資料庫事務有四個特性即acid,具體分別是原子性,一致性,隔離性和永續性。事務如果在service層,那麼每個業務處理方法有自己的事務,乙個事務中只連線了資料庫一次,有時候比如方法裡面有多個增刪改查這種情況,其實這也只連線了一次資料庫,並不是多次訪問資料庫,這個容易混淆。
再來看mysql四種事務隔離級別,隔離級別由高到低分別為序列化,可重複度,讀已提交和讀未提交。事務隔離級別可以通過sql語句設定,設定資料庫的隔離級別一定要在開啟事務之前。mysql的預設隔離級別是可重複度。
高度隔離會限制可並行執行的事務數,所以一些應用程式選擇降低隔離級別以換取更大的吞吐量。
如果資料庫事務沒有隔離會產生三個問題,分別為臟讀,不可重複度和幻讀。可以畫張圖對應一下關係。
簡單總結:
髒讀就是a插入了乙個資料,還沒提交被b讀去了。如果a這個時候回滾了,b就讀到了髒資料。不管a有沒有回滾或者提交,如果a更新了一下這條資料,b在乙個事務內又讀了一次發現兩次讀的不一樣,這就是不可重複讀。幻讀就是假設表中某個字段所有值都為1,a在讀的時候b插入了乙個2,a就讀錯了,這個2就像幻想一樣。
讀未提交當然問題最多,可以讀到其他事務未提交的資料當然問題多。讀並行事務已提交的資料就好一點,可以解決髒讀問題。可重複讀隔離級別下使用了mvcc機制,select操作不更新版本號即讀的歷史資料,而insert,update和delete會更新版本號,即用最新的資料去增刪改,所以讀不會有問題。理論上可序列是最安全的,那為什麼mysql不預設這個隔離級別呢,因為可序列讀下每個事務不管讀寫都會鎖表,效率太低了。
事務執行的三種模式:
1.自定提交事務
2.顯式事務
3.隱性事務
spring中管理方式的方式可分為兩種:程式設計式和宣告式事務。由於程式設計式事務使用較少(不符合spring習慣),故接下來重點闡述
宣告式事務,宣告式事務又可以分為xml配置方式和註解配置方式。在配置之前首先應該明確,spring中管理事務物件的依賴關係
如圖:
現在以配置jdbc的事務管理為例,分別演示用xml方式和註解方式配置宣告式事務。如下:
1.xml方式
步驟1.匯入aop開發相關的包,因為xml方式配置就是基於aop開發思想的
spring-aop.jar; aspectj.jar;spring-aspects.jar
步驟2.配置事務管理器,注意上圖,jdbc事務管理器依賴於datasource存在,故在配置中需要體現此種關係
步驟3.配置事務的通知
步驟4.配置將通知織入目標
註解方式
步驟1,導包和開啟事務管理與xml方式一致,不再累述。
步驟2.開啟註解管理事務
步驟3.在使用的類中新增乙個註解@transactional
小結:對比以上兩種方式,可以得出乙個結論,xml方式配置比較麻煩,但是比較統一,可以一次性解決問題。註解配置方式比較簡單,且比較靈活,可以在比較少事務管理的時候使用註解方式。在對專案要求嚴謹時,使用xml方式。
關於資料庫事務
三種錯誤 1.髒讀 可以讀取為提交的事務的資料,若事務回滾,則讀取的資料失效 2.不可重複讀 乙個事務中有兩次讀取同一行資料,兩次讀取之間另乙個事務修改了這一行且提交,則兩次讀取內容不同 3.幻讀 乙個事務在執行兩次相同的範圍查詢時,另乙個事務新增了一行資料,導致兩次範圍查詢記錄不同 四中隔離級別 ...
資料庫事務的隔離級別簡單總結
資料庫中事務的隔離級別有四種,級別由低到高分別為 read uncommitted read committed repeatable read和serializable 四種。這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾個問題。如果當前隔離級別為read uncommitted時,可能出現髒讀...
資料庫事務總結
資料庫併發訪問會出現以下4種問題 1 第一類丟失更新 事務b巢狀在事務a中,事務b已經更新,之後事務a更新失敗,a回滾,丟失了b的更新。支援事務的資料庫不會出現此問題 2 髒讀 讀到其他事務還未提交的資料。3 不可重複讀 在同一事務中,兩次讀取的資料不一致。被其他事務修改了 4 幻讀 兩次讀取的記錄...