談談對於資料庫事物的理解
阿新 • • 發佈:2018-11-23
總所周知的,資料庫有4個基本的特性,別人問道我,之前我也是可以做到脫口而出,不就是ACID嗎?這又什麼難度,
(1)A:原子性(Atomicity)
(2)C:一致性(Consistency)
(3)I:隔離性(Isolation)
(4)D:永續性(dependency)
我也很清楚的明白每個特性代表的意義,原子性不就是說資料庫的每一個操作都是原子的嗎?如果發生就發生,不發生就不發生,俗稱說一做一,一致性,不就是更改的資料前後要一致嗎?隔離性每個事物之前相互獨立?永續性,我們做出的資料操作是永久儲存到資料磁碟中去的。
雖然對於這些特性的解釋很熟練,但是對於真正理解資料庫的含義,我確實非常不解的,總是模糊不清,也是是當初還沒有現在的這個境界吧,很多的概念隨著時間的流逝我也變得清晰起來了,為了得到更好的併發效果,我們很多時候都是從隔離性這裡入手的,根據不同的隔離性採用不同的策略,但不同的隔離級別會帶來不同的問題髒讀,幻讀,不可重複讀,先來看看4個隔離級別:
(1)read-uncommit:讀-不提交事物
(2)read-commit:讀-提交事務
(3)read-repeated:可重複讀
(4)
Serializable:序列化
我們通過一個例子來說明一下,最常見的銀行卡里面錢的問題:
(1)比如你的賬戶裡面現在有1000塊,你現在準備去買點東西,買東西的時候你查了一下餘額,發現還有800,然後就準備刷卡購物100,但其實在你查詢的這個時間,你的老婆正在消費,花了200,但是事物沒有提交,過了一會,你結賬了,但是你的老婆沒有買單,她取消了,然後你重新查了一下帳,我的乖乖,怎麼你的卡無端端的多了200?發現竟然有900塊!!!!!!!!是不是很神奇,這就是所謂的髒讀,沒有read-uncommit可以讀取到沒有提交 事物的資料,為了解決這個問題,
(2)read-commit,即是每一次讀取事物都是從提交的事物讀取的資料,還是這個例子,你去買東西之前查了一下你的銀行卡餘額還有2000,於是準備去買一臺1999的手機,但是扣款的時候發現餘額不足!!!因為在這個過程你老婆使用了一次卡,用了500,並且把事物提交了,所以餘額不足,雖然解決了髒讀的問題,但是會帶來不可重複讀的問題,於是聰敏的人就又改成了repeated可重複讀,
(3)repeated:可重複讀其實也很簡單理解,就是我在讀取資料的時候不允許改變資料操作。但是會出現幻讀的操作,比如你在查詢餘額的時候顯示是1000,但是打印出來的時候是800,因為這段時間你讀取資料完了之後,你的老婆消費了200,所以會出現幻讀.
(4)可序列化就不多作介紹了,跟同步一樣,操作要一個一個的做,併發效能比較差,最好的方法就是跟程式設計的鎖聯絡在一起理解資料庫的隔離級別,實現這些隔離級別分別是時候了什麼鎖的型別來實現的。
詳細的資料庫事物可能還有很多,但我覺得理解這樣對於普通的開發足夠了。