數據庫事務特性和隔離級別
事務
一組業務操作,要麽全部成功,要麽全部不成功。
----------------事務的特性--------------
原子性:一個事務是一個整體,不可分割,事務中的操作要麽都成功,要麽都失敗。
一致性:事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。事務執行前後,數據庫的狀態是一致的。
例如: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(保存點):記錄操作的當前位置,之後可以回滾到指定的位置
數據庫事務特性和隔離級別