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