一、事務的四個特性
1.1、什么是事務
事務是數據庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作;這些操作作為一個整體一起向系統提交,要么都執行、要么都不執行;事務是一組不可再分割的操作集合(工作邏輯單元);
1.2、事務的四個特性(ACID)
- 原子性(atomicity):操作一組指令,要么全部成功,要么不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。
- 一致性(consistency):事務的執行使數據從一個狀態轉換為另一個狀態,但是對於整個數據的完整性保持穩定。
- 隔離性(isolation):隔離性是當多個用戶並發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個並發事務之間要相互隔離。即要達到這么一種效果:對於任意兩個並發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在並發地執行。
- 持久性(durability):當事務正確完成后,它對於數據的改變是永久性的。例如我們在使用JDBC操作數據庫時,在提交事務方法后,提示用戶事務操作完成,當我們程序執行完成直到看到提示后,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因為故障而沒有執行事務的重大錯誤。
二、事務的四種隔離級別
2.1、事務的並發問題
在看事務的隔離級別之前,先來來一下事務並發執行帶來的問題:
1、臟讀
臟讀是指在一個事務處理過程中讀取了其他未提交事務中的數據。例如你銀行卡里有1000塊錢,你的妻子打算買雙500塊錢的鞋子,她付錢的時候你查看銀行卡余額為500元。這個時候,你妻子覺得太貴了不買了,撤銷還沒提交的操作,這個時候就發生了臟讀。
2、不可重復讀。
一個事務兩次讀取同一行的數據,結果得到不同狀態的結果,中間正好另一個事務更新了該數據,兩次結果相異,不可被信任。例如,你銀行卡有1000塊錢,你查看余額剩下1000塊錢,你打算買件衣服要800塊錢,當你付錢的時候你妻子此時花費500塊買了雙鞋子,你付錢時發現余額不足。
臟讀和不可重復讀的差別:臟讀讀取的是未提交事務中的數據,不可重復讀是讀了已經提交了事務的數據。
3、幻讀也叫虛讀
一個事務執行兩次查詢,第二次結果集包含第一次中沒有或某些行已經被刪除的數據,造成兩次結果不一致,只是另一個事務在這兩次查詢中間插入或刪除了數據造成的。幻讀是事務非獨立執行時發生的一種現象。例如,你查看了你們這個月的消費賬單,接着把賬單打印出來,這個時候你的妻子又花500塊錢買了條裙子,這個時候你打印出出賬單一看,發現多了條買裙子的記錄,好像出現了幻覺。
幻讀和不可重復讀都是讀取了事務提交后的記錄,但不可重復讀讀取的是更新操作的記錄,幻讀是讀取了插入或者刪除后的記錄,這點要加以區分。
2.2、事務的隔離級別
事務的隔離級別有4種,由低到高分別為Read uncommitted(讀未提交) 、Read committed(讀已提交) 、Repeatable read (重復讀)、Serializable(序列化) 。而且,在事務的並發操作中可能會出現臟讀,不可重復讀,幻讀。下面通過事例一一闡述它們的概念與聯系。
1、Read uncommitted(讀未提交)
讀未提交。顧名思義,一個事務可以讀取另一個未提交事務的數據。讀未提交是最低的隔離級別。
2、Read committed(讀已提交)
讀已提交,也就是只能讀取已經提交過事務的數據。這個隔離能夠防止臟讀的發生,但是不能防止不可重復讀和幻讀的發生。
3、Repeatable read (重復讀)
重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作。這個隔離級別能夠防止臟讀和不可重復讀的發生,但是不能防止幻讀的發生。
4、Serializable(序列化)
Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
總結:大多數數據庫默認的事務隔離級別是Read committed,比如Sql Server , Oracle。Mysql的默認隔離級別是Repeatable read。
隔離級別的設置只對當前鏈接有效。對於使用MySQL命令窗口而言,一個窗口就相當於一個鏈接,當前窗口設置的隔離級別只對當前窗口中的事務有效;對於JDBC操作數據庫來說,一個Connection對象相當於一個鏈接,而對於Connection對象設置的隔離級別只對該Connection對象有效,與其他鏈接Connection對象無關。
設置數據庫的隔離級別一定要是在開啟事務之前。
三、事務的傳播行為
Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為。事務傳播行為是Spring框架獨有的事務增強特性,他不屬於的事務實際提供方數據庫行為。這是Spring為我們提供的強大的工具箱,使用事務傳播行可以為我們的開發工作提供許多便利。但是人們對他的誤解也頗多,你一定也聽過“service方法事務最好不要嵌套”的傳言。要想正確的使用工具首先需要了解工具。本文對七種事務傳播行為做詳細介紹,內容主要代碼示例的方式呈現。
事務傳播行為用來描述由某一個事務傳播行為修飾的方法被嵌套進另一個方法的時事務如何傳播。
四、總結
本文主要對事務的特性、事務的隔離級別,和spring定義的事務傳播行為做了介紹,希望對小伙伴們有幫助。