1.什麼是事務?
事務是對資料庫中一系列操作進行統一的復原或者送出的操作,主要用來保證資料的完整性和一緻性。
2.事務的四大特性ACID
原子性(Atomicity):
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗復原,是以事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。
一緻性(Consistency):
事務開始前和結束後,資料庫的完整性限制沒有被破壞。比如 A 向 B 轉賬,不可能 A 扣了錢,B 卻沒收到。
隔離性(Isolation):
隔離性是當多個使用者并發通路資料庫時,比如操作同一張表時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作所幹擾,多個并發事務之間要互相隔離。同一時間,隻允許一個事務請求同一資料,不同的事務之間彼此沒有任何幹擾。比如 A 正在從一張銀行卡中取錢,在 A 取錢的過程結束前,B 不能向這張卡轉賬。
持久性(Durability):
持久性是指一個事務一旦被送出了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丢失送出事務的操作。
3.事務隔離級别,每個級别會引發什麼問題
資料庫事務的隔離級别有 4 種,由低到高分别為 Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的并發操作中可能會出現髒讀,不可重複讀,幻讀。
1、髒讀:事務 A 讀取了事務 B 更新的資料,然後 B 復原操作,那麼 A 讀取到的資料是髒資料
2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務 A 多次讀取的過程中,對資料作了更新并送出,導緻事務 A 多次讀取同一資料時,結果是以本事務先後兩次讀到的資料結果會不一緻。
3、幻讀:幻讀解決了不重複讀,保證了同一個事務裡,查詢的結果都是事務開始時的狀态(一緻性)。
事例:程式員某一天去消費,花了2千元,然後他的妻子去檢視他今天的消費記錄(全表掃描FTS,妻子事務開啟),看到确實是花了2千元,就在這個時候,程式員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,并送出。當妻子列印程式員的消費記錄清單時(妻子事務送出),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。
Read uncommitted
讀未送出,顧名思義,就是一個事務可以讀取另一個未送出事務的資料。
那怎麼解決髒讀呢?Read committed!讀送出,能解決髒讀問題。
Read committed
讀送出,顧名思義,就是一個事務要等另一個事務送出後才能讀取資料。
若有事務對資料進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務送出後才能讀取資料,可以解決髒讀問題。但在這個事例中,出現了一個事務範圍内兩個相同的查詢卻傳回了不同資料,這就是不可重複讀。
那怎麼解決可能的不可重複讀問題?Repeatable read !
Repeatable read
重複讀,就是在開始讀取資料(事務開啟)時,不再允許修改操作
在同一個事務裡,SELECT的結果是事務開始時時間點的狀态,是以,同樣的SELECT操作讀到的結果會是一緻的。但是,會有幻讀現象
重複讀可以解決不可重複讀問題。寫到這裡,應該明白的一點就是,不可重複讀對應的是修改,即 UPDATE 操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入 INSERT 操作,而不是 UPDATE 操作。
Serializable 序列化
Serializable 是最高的事務隔離級别,在該級别下,事務串行化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級别效率低下,比較耗資料庫性能,一般不使用。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重于修改,幻讀側重于新增或删除。解決不可重複讀的問題隻需鎖住滿足條件的行,解決幻讀需要鎖表。
值得一提的是:大多數資料庫預設的事務隔離級别是Read committed,比如Sql Server , Oracle。Mysql的預設隔離級别是Repeatable read。
事務隔離級别:未送出讀時,寫資料隻會鎖住相應的行。
事務隔離級别為:可重複讀時,寫資料會鎖住整張表。
事務隔離級别為:串行化時,讀寫資料都會鎖住整張表。
隔離級别越高,越能保證資料的完整性和一緻性,但是對并發性能的影響也越大,魚和熊掌不可兼得啊。對于多數應用程式,可以優先考慮把資料庫系統的隔離級别設為Read Committed,它能夠避免髒讀取,而且具有較好的并發性能。盡管它會導緻不可重複讀、幻讀這些并發問題,在可能出現這類問題的個别場合,可以由應用程式采用悲觀鎖或樂觀鎖來控制。
【Java 面試那點事】
這裡緻力于分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裡都有!
這裡可以讓你【快速了解 Java 相關知識】,并且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!