事務(wù)
1. 什么是數(shù)據(jù)庫事務(wù)?
事務(wù)是一個(gè)不可分割的數(shù)據(jù)庫操作序列硫眨,也是數(shù)據(jù)庫并發(fā)控制的基本單位郊酒,其執(zhí)行的結(jié)果必須使數(shù)據(jù)庫從一種一致性狀態(tài)變到另一種一致性狀態(tài)状蜗。事務(wù)是邏輯上的一組操作确封,要么都執(zhí)行除呵,要么都不執(zhí)行。
事務(wù)最經(jīng)典也經(jīng)常被拿出來說例子就是轉(zhuǎn)賬了爪喘。
假如小明要給小紅轉(zhuǎn)賬1000元颜曾,這個(gè)轉(zhuǎn)賬會(huì)涉及到兩個(gè)關(guān)鍵操作就是:將小明的余額減少1000元,將小紅的余額增加1000元秉剑。萬一在這兩個(gè)操作之間突然出現(xiàn)錯(cuò)誤比如銀行系統(tǒng)崩潰泛豪,導(dǎo)致小明余額減少而小紅的余額沒有增加,這樣就不對(duì)了。事務(wù)就是保證這兩個(gè)關(guān)鍵操作要么都成功诡曙,要么都要失敗臀叙。
2. 事物的四大特性(ACID)介紹一下?
關(guān)系性數(shù)據(jù)庫需要遵循ACID規(guī)則,具體內(nèi)容如下:
(1)原子性:事務(wù)是最小的執(zhí)行單位价卤,不允許分割劝萤。事務(wù)的原子性確保動(dòng)作要么全部完成,要么完全不起作用荠雕;
(2)一致性:執(zhí)行事務(wù)前后稳其,數(shù)據(jù)保持一致驶赏,多個(gè)事務(wù)對(duì)同一個(gè)數(shù)據(jù)讀取的結(jié)果是相同的炸卑;
(3)隔離性:并發(fā)訪問數(shù)據(jù)庫時(shí),一個(gè)用戶的事務(wù)不被其他事務(wù)所干擾煤傍,各并發(fā)事務(wù)之間數(shù)據(jù)庫是獨(dú)立的盖文;
(4)持久性:一個(gè)事務(wù)被提交之后。它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的蚯姆,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對(duì)其有任何影響五续。
3. 什么是臟讀?幻讀龄恋?不可重復(fù)讀疙驾?
(1)臟讀(Drity Read):某個(gè)事務(wù)已更新一份數(shù)據(jù),另一個(gè)事務(wù)在此時(shí)讀取了同一份數(shù)據(jù)郭毕,由于某些原因它碎,前一個(gè)RollBack了操作,則后一個(gè)事務(wù)所讀取的數(shù)據(jù)就會(huì)是不正確的显押。
(2)不可重復(fù)讀(Non-repeatable read):在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致扳肛,這可能是兩次查詢過程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。
(3)幻讀(Phantom Read):在一個(gè)事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致乘碑,例如有一個(gè)事務(wù)查詢了幾列(Row)數(shù)據(jù)挖息,而另一個(gè)事務(wù)卻在此時(shí)插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中兽肤,就會(huì)發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的套腹。
4. 什么是事務(wù)的隔離級(jí)別?MySQL的默認(rèn)隔離級(jí)別是什么资铡?
為了達(dá)到事務(wù)的四大特性电禀,數(shù)據(jù)庫定義了4種不同的事務(wù)隔離級(jí)別,由低到高依次為Read uncommitted害驹、Read committed鞭呕、Repeatable read、Serializable,這四個(gè)級(jí)別可以逐個(gè)解決臟讀葫松、不可重復(fù)讀瓦糕、幻讀這幾類問題。
SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別:
(1)D-UNCOMMITTED(讀取未提交):最低的隔離級(jí)別腋么,允許讀取尚未提交的數(shù)據(jù)變更咕娄,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀珊擂。
(2)D-COMMITTED(讀取已提交):允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)圣勒,可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生摧扇。
REPEATABLE-READ(可重復(fù)讀):對(duì)同一字段的多次讀取結(jié)果都是一致的圣贸,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀扛稽,但幻讀仍有可能發(fā)生吁峻。
(3RIALIZABLE(可串行化):最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別在张。所有的事務(wù)依次逐個(gè)執(zhí)行用含,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說帮匾,該級(jí)別可以防止臟讀啄骇、不可重復(fù)讀以及幻讀。
這里需要注意的是:Mysql 默認(rèn)采用的 REPEATABLE_READ隔離級(jí)別 Oracle 默認(rèn)采用的 READ_COMMITTED隔離級(jí)別
事務(wù)隔離機(jī)制的實(shí)現(xiàn)基于鎖機(jī)制和并發(fā)調(diào)度瘟斜。其中并發(fā)調(diào)度使用的是MVVC(多版本并發(fā)控制)缸夹,通過保存修改的舊版本信息來支持并發(fā)一致性讀和回滾等特性。
因?yàn)楦綦x級(jí)別越低哼转,事務(wù)請(qǐng)求的鎖越少明未,所以大部分?jǐn)?shù)據(jù)庫系統(tǒng)的隔離級(jí)別都是READ-COMMITTED(讀取提交內(nèi)容):,但是你要知道的是InnoDB 存儲(chǔ)引擎默認(rèn)使用 **REPEATABLE-READ(可重讀)**并不會(huì)有任何性能損失壹蔓。
InnoDB 存儲(chǔ)引擎在 分布式事務(wù) 的情況下一般會(huì)用到**SERIALIZABLE(可串行化)**隔離級(jí)別趟妥。
最后,小編分類整理了許多java進(jìn)階學(xué)習(xí)材料和BAT面試給熱愛IT行業(yè)的你佣蓉,如果需要資料的請(qǐng)轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進(jìn)階學(xué)習(xí)資料和BAT面試題以及《Effective Java》(第3版)電子版書籍披摄。也可以加群:712263501領(lǐng)取海量學(xué)習(xí)資料進(jìn)行學(xué)習(xí)。