Transaction 也就是所謂的事務(wù)了,通俗理解就是一件事情。從小,父母就教育我們,做事情要有始有終,不能半途而廢。 事務(wù)也是這樣,不能做一般就不做了,要么做完,要么就不做。也就是說,事務(wù)必須是一個(gè)不可分割的整體,就像我們在化學(xué)課里學(xué)到的原子,原子是構(gòu)成物質(zhì)的最小單位。于是,人們就歸納出事務(wù)的第一個(gè)特性:原子性(Atomicity)。我靠,一點(diǎn)都不神秘嘛。
10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有樟樹免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
特別是在數(shù)據(jù)庫領(lǐng)域,事務(wù)是一個(gè)非常重要的概念,除了原子性以外,它還有一個(gè)極其重要的特性,那就是:一致性(Consistency)。也就是說,執(zhí)行完數(shù)據(jù)庫操作后,數(shù)據(jù)不會被破壞。打個(gè)比方,如果從 A 賬戶轉(zhuǎn)賬到 B 賬戶,不可能因?yàn)?A 賬戶扣了錢,而 B 賬戶沒有加錢吧。如果出現(xiàn)了這類事情,您一定會非常氣憤,什么 diao 銀行啊!
當(dāng)我們編寫了一條 update 語句,提交到數(shù)據(jù)庫的一剎那間,有可能別人也提交了一條 delete 語句到數(shù)據(jù)庫中。也許我們都是對同一條記錄進(jìn)行操作,可以想象,如果不稍加控制,就會出×××煩來。我們必須保證數(shù)據(jù)庫操作之間是“隔離”的(線程之間有時(shí)也要做到隔離),彼此之間沒有任何干擾。這就是:隔離性(Isolation)。
要想真正的做到操作之間完全沒有任何干擾是很難的,于是乎,每天上班打醬油的數(shù)據(jù)庫專家們,開始動腦筋了,“我們要制定一個(gè)規(guī)范,讓各個(gè)數(shù)據(jù)庫廠商都支持我們的規(guī)范!”,這個(gè)規(guī)范就是:事務(wù)隔離級別(Transaction Isolation Level)。能定義出這樣牛逼的規(guī)范真的挺不容易的,其實(shí)說白了就四個(gè)級別:
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE
千萬不要去翻譯,那只是一個(gè)代號而已。從上往下,級別越來越高,并發(fā)性越來越差,安全性越來越高,反之則反。
當(dāng)我們執(zhí)行一條 insert 語句后,數(shù)據(jù)庫必須要保證有一條數(shù)據(jù)永久地存放在磁盤中,這個(gè)也算事務(wù)的一條特性, 它就是:持久性(Durability)。
歸納一下,以上一共提到了事務(wù)的 4 條特性,把它們的英文單詞首字母合起來就是:ACID,這個(gè)就是傳說中的“事務(wù) ACID 特性”!
這四個(gè)家伙當(dāng)中,誰才是老大?
其實(shí)想想也就清楚了:原子性是基礎(chǔ),隔離性是手段,持久性是目的,真正的老大就是一致性。數(shù)據(jù)不一致了,就相當(dāng)于“江湖亂套了,流氓戴胸罩”。所以說,這三個(gè)小弟都是跟著“一致性”這個(gè)老大混,為他全心全意服務(wù)。
這四個(gè)家伙當(dāng)中,其實(shí)最難理解的反倒不是一致性,而是隔離性。因?yàn)樗潜WC一致性的重要手段,是工具,使用它不能有半點(diǎn)差池,否則后果自負(fù)!
事務(wù)并發(fā)所引起的跟讀取數(shù)據(jù)有關(guān)的問題,各用一句話來描述一下:
1.臟讀:事務(wù) A 讀取了事務(wù) B 未提交的數(shù)據(jù),并在這個(gè)基礎(chǔ)上又做了其他操作。
首先看看“臟讀”,看到“臟”這個(gè)字,我就想到了惡心、骯臟。數(shù)據(jù)怎么可能臟呢?其實(shí)也就是我們經(jīng)常說的“垃圾數(shù)據(jù)”了。比如說,有兩個(gè)事務(wù),它們在并發(fā)執(zhí)行(也就是競爭)。
余額應(yīng)該為 1500 元才對!請看 T5 時(shí)間點(diǎn),事務(wù) A 此時(shí)查詢余額為 0 元,這個(gè)數(shù)據(jù)就是臟數(shù)據(jù),它是事務(wù) B 造成的,明顯事務(wù)沒有進(jìn)行隔離,滲過來了,亂套了。
2.不可重復(fù)讀:事務(wù) A 讀取了事務(wù) B 已提交的更改數(shù)據(jù)。
事務(wù) A 其實(shí)除了查詢了兩次以外,其他什么事情都沒有做,結(jié)果錢就從 1000 變成 0 了,這就是重復(fù)讀了??上攵?,這是別人干的,不是我干的。其實(shí)這樣也是合理的,畢竟事務(wù) B 提交了事務(wù),數(shù)據(jù)庫將結(jié)果進(jìn)行了持久化,所以事務(wù) A 再次讀取自然就發(fā)生了變化。
這種現(xiàn)象基本上是可以理解的,但在有些變態(tài)的場景下卻是不允許的。畢竟這種現(xiàn)象也是事務(wù)之間沒有隔離所造成的,但我們對于這種問題,似乎可以忽略。
3.幻讀:事務(wù) A 讀取了事務(wù) B 已提交的新增數(shù)據(jù)。
銀行工作人員,每次統(tǒng)計(jì)總存款,都看到不一樣的結(jié)果。不過這也確實(shí)也挺正常的,總存款增多了,肯定是這個(gè)時(shí)候有人在存錢。但是如果銀行系統(tǒng)真的這樣設(shè)計(jì),那算是玩完了。這同樣也是事務(wù)沒有隔離所造成的,但對于大多數(shù)應(yīng)用系統(tǒng)而言,這似乎也是正常的,可以理解,也是允許的。銀行里那些惡心的那些系統(tǒng),要求非常嚴(yán)密,統(tǒng)計(jì)的時(shí)候,甚至?xí)⑺械钠渌僮鹘o隔離開,這種隔離級別就算非常高了
第一條是堅(jiān)決抵制的,后兩條在大多數(shù)情況下可不作考慮。
這就是為什么必須要有事務(wù)隔離級別這個(gè)東西了,它就像一面墻一樣,隔離不同的事務(wù).