一、事務的基本要素(ACID)
1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,即事務是一個不可分割的整體。
2、一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。
3、隔離性(Isolation):同一時間,不同的事務之間彼此沒有任何干擾。
4、持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。
二、事務的隔離級別
在數據庫操作中,爲了有效保證併發讀取數據的正確性,提出的事務隔離級別。
事務隔離級別共四種,隔離的程度由低至高就是:
1)READ-UNCOMMITTED(讀取未提交內容)
允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。
2)READ-COMMITTED(讀取提交內容)
允許不可重複讀取,但不允許髒讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
3)REPEATABLE-READ(可重讀)
禁止不可重複讀取和髒讀取,但是有時可能出現幻讀數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
4)SERIERLIZED(串行化)
提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設爲Read Committed。它能夠避免髒讀取,而且具有較好的併發性能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。
三、Spring中的事務傳播
序號 | 事務傳播類型 | 說明 |
---|---|---|
1 | PROPAGATION_REQUIRED | 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
2 | PROPAGATION_SUPPORTS | 支持當前事務,如果當前沒有事務,就以非事務方式執行 |
3 | PROPAGATION_MANDATORY | 使用當前的事務,如果當前沒有事務,就拋出異常。 |
4 | PROPAGATION_REQUIRES_NEW | 新建事務,如果當前存在事務,把當前事務掛起。 |
5 | PROPAGATION_NOT_SUPPORTED | 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
6 | PROPAGATION_NEVER | 以非事務方式執行,如果當前存在事務,則拋出異常。 |
7 | PROPAGATION_NESTED | 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。 |