溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳談事務的幾大特點

發(fā)布時間:2020-04-14 00:06:26 來源:網(wǎng)絡 閱讀:251 作者:小止1995 欄目:數(shù)據(jù)庫

Transaction 也就是所謂的事務了,通俗理解就是一件事情。從小,父母就教育我們,做事情要有始有終,不能半途而廢。 事務也是這樣,不能做一般就不做了,要么做完,要么就不做。也就是說,事務必須是一個不可分割的整體,就像我們在化學課里學到的原子,原子是構(gòu)成物質(zhì)的最小單位。于是,人們就歸納出事務的第一個特性:原子性(Atomicity)。我靠,一點都不神秘嘛。


特別是在數(shù)據(jù)庫領域,事務是一個非常重要的概念,除了原子性以外,它還有一個極其重要的特性,那就是:一致性(Consistency)。也就是說,執(zhí)行完數(shù)據(jù)庫操作后,數(shù)據(jù)不會被破壞。打個比方,如果從 A 賬戶轉(zhuǎn)賬到 B 賬戶,不可能因為 A 賬戶扣了錢,而 B 賬戶沒有加錢吧。如果出現(xiàn)了這類事情,您一定會非常氣憤,什么 diao 銀行??!


當我們編寫了一條 update 語句,提交到數(shù)據(jù)庫的一剎那間,有可能別人也提交了一條 delete 語句到數(shù)據(jù)庫中。也許我們都是對同一條記錄進行操作,可以想象,如果不稍加控制,就會出×××煩來。我們必須保證數(shù)據(jù)庫操作之間是“隔離”的(線程之間有時也要做到隔離),彼此之間沒有任何干擾。這就是:隔離性(Isolation)。


要想真正的做到操作之間完全沒有任何干擾是很難的,于是乎,每天上班打醬油的數(shù)據(jù)庫專家們,開始動腦筋了,“我們要制定一個規(guī)范,讓各個數(shù)據(jù)庫廠商都支持我們的規(guī)范!”,這個規(guī)范就是:事務隔離級別(Transaction Isolation Level)。能定義出這樣牛逼的規(guī)范真的挺不容易的,其實說白了就四個級別:


  1. READ_UNCOMMITTED

  2. READ_COMMITTED

  3. REPEATABLE_READ

  4. SERIALIZABLE

千萬不要去翻譯,那只是一個代號而已。從上往下,級別越來越高,并發(fā)性越來越差,安全性越來越高,反之則反。


當我們執(zhí)行一條 insert 語句后,數(shù)據(jù)庫必須要保證有一條數(shù)據(jù)永久地存放在磁盤中,這個也算事務的一條特性, 它就是:持久性(Durability)。


歸納一下,以上一共提到了事務的 4 條特性,把它們的英文單詞首字母合起來就是:ACID,這個就是傳說中的“事務 ACID 特性”!

這四個家伙當中,誰才是老大?


其實想想也就清楚了:原子性是基礎,隔離性是手段,持久性是目的,真正的老大就是一致性。數(shù)據(jù)不一致了,就相當于“江湖亂套了,流氓戴胸罩”。所以說,這三個小弟都是跟著“一致性”這個老大混,為他全心全意服務。


這四個家伙當中,其實最難理解的反倒不是一致性,而是隔離性。因為它是保證一致性的重要手段,是工具,使用它不能有半點差池,否則后果自負!

事務并發(fā)所引起的跟讀取數(shù)據(jù)有關的問題,各用一句話來描述一下:

   1.臟讀:事務 A 讀取了事務 B 未提交的數(shù)據(jù),并在這個基礎上又做了其他操作。

首先看看“臟讀”,看到“臟”這個字,我就想到了惡心、骯臟。數(shù)據(jù)怎么可能臟呢?其實也就是我們經(jīng)常說的“垃圾數(shù)據(jù)”了。比如說,有兩個事務,它們在并發(fā)執(zhí)行(也就是競爭)。

余額應該為 1500 元才對!請看 T5 時間點,事務 A 此時查詢余額為 0 元,這個數(shù)據(jù)就是臟數(shù)據(jù),它是事務 B 造成的,明顯事務沒有進行隔離,滲過來了,亂套了。

 2.不可重復讀:事務 A 讀取了事務 B 已提交的更改數(shù)據(jù)。

事務 A 其實除了查詢了兩次以外,其他什么事情都沒有做,結(jié)果錢就從 1000 變成 0 了,這就是重復讀了??上攵@是別人干的,不是我干的。其實這樣也是合理的,畢竟事務 B 提交了事務,數(shù)據(jù)庫將結(jié)果進行了持久化,所以事務 A 再次讀取自然就發(fā)生了變化。

這種現(xiàn)象基本上是可以理解的,但在有些變態(tài)的場景下卻是不允許的。畢竟這種現(xiàn)象也是事務之間沒有隔離所造成的,但我們對于這種問題,似乎可以忽略。

 3.幻讀:事務 A 讀取了事務 B 已提交的新增數(shù)據(jù)。

銀行工作人員,每次統(tǒng)計總存款,都看到不一樣的結(jié)果。不過這也確實也挺正常的,總存款增多了,肯定是這個時候有人在存錢。但是如果銀行系統(tǒng)真的這樣設計,那算是玩完了。這同樣也是事務沒有隔離所造成的,但對于大多數(shù)應用系統(tǒng)而言,這似乎也是正常的,可以理解,也是允許的。銀行里那些惡心的那些系統(tǒng),要求非常嚴密,統(tǒng)計的時候,甚至會將所有的其他操作給隔離開,這種隔離級別就算非常高了

第一條是堅決抵制的,后兩條在大多數(shù)情況下可不作考慮。

這就是為什么必須要有事務隔離級別這個東西了,它就像一面墻一樣,隔離不同的事務.

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI