什麼是事務?事務特性?事務隔離級別?spring事務傳播特性?

1、事務的概述spring

  什麼是事務?sql

  在數據庫中,所謂事務是指一組邏輯操做單元即一組sql語句,當這個單元中的一部分操做失敗,整個事務回滾,只有所有正確才完成提交。判斷事務是否配置成功的關鍵點在於出現異常時事務是否會回滾。數據庫

2、事務的特性(ACID)多線程

  1.原子性(Atomicity)學習

   原子性是指事務是一個不可分割的工做單位,事務中的操做要麼都發生,要麼都不發生。ui

  2.一致性(Consistency)spa

   事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態。(數據不被破壞)線程

  3.隔離性(Isolation)對象

   事務的隔離性是指一個事務的執行不能被其餘事務干擾。事務

  4.持久性(Durability)

   持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,即便系統重啓也不會丟失。

 

  在JDBC中,事務默認是自動提交的,每次執行一個SQL語句時,若是執行成功,就會向數據庫自動提交,而不能回滾。

  爲了讓多個SQL語句做爲一個事務執行:

  (1)執行語句前調用Connection對象的setAutoCommit(false);以取消自動提交事務。

  (2)在全部的SQL語句都成功執行後,調用commit();方法提交事務。

  (3)在出現異常時,調用rollback();方法回滾事務。

3、事務的隔離級別

  事務的隔離性,當多個線程都開啓事務操做數據庫中的數據時,數據庫系統要能進行隔離操做,以保證各個線程獲取數據的準確性;

  在介紹數據庫提供的各類隔離級別以前,咱們先看看若是不考慮事務的隔離性,會發生的幾種問題:

1,髒讀

  髒讀是指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。

  事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據

2,不可重複讀

  不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。

  事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。

3,虛讀(幻讀)

幻讀是事務非獨立執行時發生的一種現象。

    系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。

4、MySQL數據隔離級別

如今來看看MySQL數據庫爲咱們提供的四種隔離級別:

  ① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。

  ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。

  ③ Read committed (讀已提交):可避免髒讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。

  以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,固然級別越高,執行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(相似於Java多線程中的鎖)使得其餘的線程只能在鎖外等待,因此平時選用何種隔離級別應該根據實際狀況。在MySQL數據庫中默認的隔離級別爲Repeatable read (可重複讀)。

  在MySQL數據庫中,支持上面四種隔離級別,默認的爲Repeatable read (可重複讀);而在Oracle數據庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的爲Read committed級別。

5、事務傳播特性

  事務傳播行爲就是多個事務方法相互調用時,事務如何在這些方法間傳播。spring支持7種事務傳播行爲:

    • propagation_requierd:方法被調用時,若是沒有事務覆蓋則自動開啓事務,若是已經在事務範圍內則使用外層提供的事務,
      不管調用了多少個方法,都使用同一個事務,只要有一個方法出現異常,則所有回滾,不然開啓新事務。
    • propagation_requires_new:不管以前有沒有開啓事務自身都會單獨開啓新的事務,開啓的每一個事務出現異常時只會影響本身的事務。
    • propagation_supports:自身不會開啓事務,若是在事務範圍內則使用外層方法提供的事務,不然不使用事務,當不使用事務時Mysql會自動提交,Oracle不會。
    • propagation_not_supported:自身不會開啓事務,在事務範圍內使用,自身掛起事務(可是若是出現異常會影響外層的事務),運行完畢恢復事務。
    • propagation_mandatory:自身不開啓事務,必須在事務環境使用不然報錯。
    • propagation_never:自身不會開啓事務,在事務範圍使用拋出異常。
    • propagation_nested:若是一個活動的事務存在,則運行在一個嵌套的事務中(會使用外層提供的事務),若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。須要JDBC3.0以上支持。

    Spring 默認的事務傳播行爲是 PROPAGATION_REQUIRED,它適合於絕大多數的狀況。假設 ServiveX#methodX() 都工做在事務環境下(即都被 Spring 事務加強了),假設程序中存在以下的調用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那麼這 3 個服務類的 3 個方法經過 Spring 的事務傳播機制都工做在同一個事務中。

 

本文是本人結合其餘博客和本身的學習進行的總結,感謝其餘博客的文章分享,歡迎學習瀏覽。

相關文章
相關標籤/搜索