mysql四种事务级别_【MySQL 知识】四种事务隔离级别
摘要:本篇文章主要是為了對MySQL的四種事務隔離級別的介紹。為了保證數據庫的正確性與一致性,數據庫事務具有原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。事務的四種隔離級別根據隔離級別由低到高分別為讀未提交(READ_UNCOMMITTED)、讀已提交(READ_COMMITTED)、可重復讀(REPEATABLE_READ)、串行化(SERIALIZABLE)。串行化事物隔離級別可以做到事務 100% 隔離,可避免臟讀、不可重復讀、幻讀的發生,但是對并發性能的影響也是最大的。
一、事務的基礎概念
根據維基百科的定義,數據庫事務(簡稱:事務)是數據庫管理系統DBMS(Database Management System)執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。
簡單來講,事務是用戶定義的一系列有限的數據庫操作,這些操作可以視為一個完整的邏輯處理工作單元,要么全部執行,要么全部不執行,是不可分割的工作單元。
例如,在關系數據庫中,一個事務可以是一條SQL語句、一組SQL語句或整個程序。事務和程序是兩個概念。一般地講,一個程序中包含多個事務。事務的開始與結束可以由用戶顯式控制。如果用戶沒有顯式地定義事務,則由DBMS按缺省規定自動劃分事務。
數據庫事務的使用:
BEGIN TRANSACTION – 開始事務,事務開始保存點
ROLLBACK TRANSACTION – 回滾事務,由于出現錯誤,回滾數據到事務開始之前
COMMIT TRANSACTION – 提交事務,保存數據到數據庫中
數據庫事務的目的:
為數據庫操作提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
當多個應用程序在并發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾或者返回不準確的結果。必須保證事務之間獨立運行,互不影響。
二、事務的基本要素(ACID)
并非任意對數據庫的操作序列都是數據庫事務。為了保證數據庫的正確性與一致性,數據庫事務必須具有以下四個特性(ACID):
原子性(Atomicity):事務的原子性保證事務中包含的一組更新操作是原子的,不可分割的,不可分割是事務最小的工作單位,所包含的操作被視為一個整體,執行過程中遵循要么全部執行,要不都不執行,不存在一半執行,一半未執行的情況。
一致性(Consistency):事務必須滿足數據庫的完整性約束,且事務執行完畢后會將數據庫由一個一致性的狀態變為另一個一致性的狀態。事務的一致性與原子性是密不可分的,如銀行轉賬的例子 A賬戶向B賬戶轉1000元錢,首先A賬戶減去1000元錢,然后B賬戶增加1000元錢,這兩動作是一個整體,失去任何一個操作數據的一致性狀態都會遭到破壞,所以這兩個動作是一個整體,要么全部操作,要么都不執行,可見事務的一致性與原子性息息相關。
隔離性(Isolation):事務的隔離性要求事務之間是彼此獨立的、隔離的。即多個事務并發執行時,一個事務的執行不應影響其他事務的執行。具體到操作是指一個事務的操作必須在一個事務commit之后才可以進行操作。多事務并發執行時,相當于將并發事務變成串行事務,順序執行,如同串行調度般的執行事務。這里事務通過鎖機制來保證它的可串行化。
持久性(Durability):事務的持久性,是指一個事務一旦提交,它對數據庫的改變將是永久性的,數據一旦寫進了物理磁盤,其他操作將不會對它產生任何影響。即已被提交的事務對數據庫的修改應該永久保存在數據庫中。
三、事務的并發問題
不同的事務隔離級別狀態下,會對數據庫的數據產生以下幾種影響:
臟讀:事務 A 讀取了事務 B 更新的數據,然后 B 回滾操作,那么 A 讀取到的數據是臟數據。
不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務 A 多次讀取的過程中,對數據作了更新并提交,導致事務 A 多次讀取同一數據時,結果不一致。
幻讀:系統管理員 A 將數據庫中所有學生的成績從具體分數改為 ABCDE 等級,但是系統管理員 B 就在這個時候插入了一條具體分數的記錄,當系統管理員 A 改結束后發現還有一條記錄沒有改過來,就好像發生了幻覺一樣
四、事務的四種隔離級別
讀未提(READ_UNCOMMITTED):一個事務還沒提交時,它做的變更就能被別的事務看到。最低的事務隔離級別,任何情況都無法保證。
讀已提交(READ_COMMITTED):保證一個事物提交后才能被另外一個事務讀取,另外一個事務不能讀取該事物未提交的數據??杀苊馀K讀的發生,但是可能會造成不可重復讀。
可重復讀(REPEATABLE_READ):多次讀取同一范圍的數據會返回第一次查詢的快照,即使其他事務對該數據做了更新修改。事務在執行期間看到的數據前后必須是一致的。但如果這個事務在讀取某個范圍內的記錄時,其他事務又在該范圍內插入了新的記錄,當之前的事務再次讀取該范圍的記錄時,會產生幻行,這就是幻讀。
串行化(SERIALIZABLE):寫會加寫鎖,讀會加讀鎖。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。這是最高的事務隔離級別,也是最可靠的級別,但是花費的代價也是最高的。該事物隔離級別可以做到事務 100% 隔離,可避免臟讀、不可重復讀、幻讀的發生。
事務隔離級別
英文
臟讀
不可重復讀
幻讀
讀未提交
READ_UNCOMMITTED
√
√
√
讀已提交(Oracle)
READ_COMMITTED
x
√
√
可重復讀(MySQL)
REPEATABLE_READ
x
x
√
序列化讀(串行化)
SERIALIZABLE
x
x
x
MySQL默認事務隔離級別是可重復讀(REPEATABLE_READ);Oracle 默認事務隔離級別是讀已提交(READ_COMMITTED)。
從上面可以看出,隔離級別越高,越能保證數據的完整性和一致性,但是對并發性能的影響也越大。
總結
以上是生活随笔為你收集整理的mysql四种事务级别_【MySQL 知识】四种事务隔离级别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java break递归_【Java】递
- 下一篇: mysql手机号11_我用不小心用 my