資料庫事務和Spring事務傳播

2021-10-04 23:12:26 字數 1762 閱讀 7033

一、事務的基本要素(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

如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。

2propagation_supports

支援當前事務,如果當前沒有事務,就以非事務方式執行

3propagation_mandatory

使用當前的事務,如果當前沒有事務,就丟擲異常。

4propagation_requires_new

新建事務,如果當前存在事務,把當前事務掛起。

5propagation_not_supported

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

6propagation_never

以非事務方式執行,如果當前存在事務,則丟擲異常。

7propagation_nested

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。

資料庫事務的隔離以及spring的事務傳播機制

資料庫的事務隔離 mysql innodb事務的隔離級別有四級,預設是 可重複讀 rr repeatable read oracle預設的是提交讀。rc 四個級別逐漸增強,每個級別解決乙個問題。spring的事務傳播機制 spring在transactiondefinition介面中規定了7種型別的...

資料庫 Spring事務

隔離級別 隔離級別的值 導致的問題 read uncommitted 0導致髒讀 read committed 1避免髒讀,允許不可重複讀和幻讀 repeatable read 2避免髒讀,不可重複讀,允許幻讀 serializable 3序列化讀,事物只能乙個乙個執行,避免了髒讀 不可重複讀 幻讀...

spring事務傳播機制與資料庫事務隔離級別

事務傳播行為型別 說明propagation required pr p ge n 傳輸 r kwa d 必須 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。propagation supports s p t 支援 支援當前事務,如果當前沒有事務,就以非事務方式執行。...