1. 程式人生 > >數據庫事務特性和隔離級別

數據庫事務特性和隔離級別

read 事務隔離 mil 對數 alt tro 取數 部分 失敗

事務

一組業務操作,要麽全部成功,要麽全部不成功。

----------------事務的特性--------------

原子性一個事務是一個整體,不可分割,事務中的操作要麽都成功,要麽都失敗。

一致性事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。事務執行前後,數據庫的狀態是一致的。

     例如:A有1000,元,B有1000元,加起來是2000,中間執行轉賬的操作,轉賬後兩個人的錢加起來還是2000.

隔離性兩個或多個事務並發操作,之間會互相影響。數據庫提供了隔離級別來消除這些影響。

持久性一旦一個事務提交了,對數據庫中的數據的影響就是永久的了,如果數據庫出現故障或者其他操作都不應該再對其產生影響。

以上是事務的四個特性簡稱ACDI,重點是事務的隔離性,在對數據庫進行操作的時候,開啟多個事務同時進行操作,為了能夠準確的獲取數據,數據庫要有隔離性。如果沒有隔離性的話,會出現以下幾個隔離問題:

----------------隔離問題----------------

臟讀一個事務讀到了另一個事務未提交的數據

不可重復讀一個事務讀到了另一個事務已經提交的數據(主要針對update)

幻讀/虛讀一個事務讀到了另一個事務已經提交的數據(主要針對insert)

----------------隔離級別----------------

為了避免這些問題,數據庫提供了四種隔離級別(級別由低到高,效率由高到低)

read uncommitted讀未提交,最低級別,存在臟讀,不可重復讀,幻讀三個問題

read committed讀已提交,只能在當前事務中讀取到其他事務已經提交的數據。避免了臟讀的問題。

repeatable read可重復讀,避免了臟讀和不可重復讀的問題。

serializable串行化,避免臟讀,不可重復讀,幻讀的發生。相當於給事務加了鎖,效率會比較低。

技術分享圖片

在mysql數據庫中,支持以上四種事務隔離級別,默認的事務隔離級別為repeatable read;

在oracle數據庫中,支持read committed、serializable兩種事務隔離級別,默認的隔離級別為read committed;

----------------jdbc對數據庫事務管理----------------

使用jdbc來對數據庫事務進行管理:對事務隔離級別的設置要在開啟事務之前

技術分享圖片

部分代碼:

技術分享圖片

savepoint(保存點)記錄操作的當前位置,之後可以回滾到指定的位置

技術分享圖片

數據庫事務特性和隔離級別