http://aliapp.blog.51cto.com/blog/8192229/1325427上一篇html
假設有這麼一組數據,性別有4種,user_id是一對多的關係,若是我想查詢數據庫
select*fromtabwhereuser_idin(?,?,?,?)and性別=’不明’app
如何進行索引構建可以得到比較好的效果呢?ide
我我的認爲,應該創建的是以user_id做爲前導列,性別做爲輔助列的索引,在大量單值查詢時會有優點。設計
理由以下htm
1.假定總數據量爲N,user_id的區分度爲N/10000而性別的區分度爲N/4blog
那麼若是以user_id做爲前導列,性別做爲後列,那麼查詢的複雜度爲O(logN+log(N/10000))。也就是說,第一次二分查找以後,下一次是在第一次的二分查找的基礎上再去查找。而若是以性別做爲前導,user_id做爲後列,那麼複雜度爲索引
O(logN+log(N/4));事務
效率略差。
而後進入本次正題。上次介紹了關係模型,那麼此次咱們來介紹一下事務。
在一切以前,我想先給本身解嘲一下。。事務我本身也沒有辦法徹底融匯貫通,由於每個小的選擇,都會致使效果的徹底不一樣,因此有錯請在後面一塊兒探討。
那麼咱們在這裏,主要以單機事務做爲入手點,而後闡述一下多機事務相關的知識點。我在這裏只是想作一個引導,讓你們可以對整個的知識體系有一個基本的認識,對於細節問題,會給出一些資料,而不會直接去進行講解,由於篇幅所限.
通常來講,咱們一提起事務,就會想到數據庫,確實,事務是數據庫的最重要的一個屬性。但這彷佛不是事務的本源,那麼,讓咱們從更深層次去對事務進行一次思考吧:
事務,本質來講就是一組由一我的(或機器)發起的連續的邏輯操做,共同的完成一件事情,在完成整個事情以前,其全部的改動,都不該該對其餘人可見和影響。而在事務結束以後,其一切的改動,都必須「所有」「馬上」對其餘的人(或機器)可見。
而後,人們爲了描述這一運做,使用了四個詞彙,這也是不少面試的同窗們折戟沉沙之處。J不過這個之前我也不會,後來發現,理解了之後,確實有點用,因此這裏也費一些筆墨吧。
原子性(Atomicity):也就是說,一組操做,要不就都成功,要不就都失敗。不存在中間狀態。
一致性(Consistency):一致性,也就是說,這個事務在提交或回滾的時候,對其餘人(或機器)來講,數據的狀態是同一的,不會出現中間的狀態。最理想的狀態下,就是說,數據提交後,全部的更改馬上同時生效,惋惜,在計算機領域,這個作不到。。由於cpu運算,磁盤寫入,內存寫入,都是要時間的,內部必定是個順序化的過程,因此不可能作到絕對的馬上同時生效。
因此一致性通常來講指代的是邏輯上的同時生效,好比,我要改A,B兩行數據,那麼,最簡單的一致性保證就是,對A,B加鎖,改A,B,而後對A,B解鎖。
這樣下一我的讀到的必定是A,B的最新值啦。
(但這塊有不少種解釋,通常來講這是個最不明確的詞彙)。
隔離性(Isolation):隔離,這是面試最容易掛的一個問題,其實我認爲不怪咱們,而是由於自己這個隔離性,是依託鎖來進行設計的。
咱們所知道的鎖,主要有如下幾種,1.讀寫鎖,2.排他鎖
那麼這四種級別其實就和這兩種鎖的實現有關,之因此要定義四個級別,其實緣由也是由於,鎖的範圍越大,並行效率越低。而範圍越小,那麼並行的效率就越高。
讀未提交:其實就是什麼鎖也沒有,因此數據的中間狀態,是可能被其餘人讀到的。
讀已提交:就是讀寫鎖實現,讀鎖在查詢以後會被釋放掉,因此這樣其餘人可能會更改那些被釋放了讀鎖的數據,這樣當前事務再去讀取的時候,就可能讀取到被別人修改過的數據了,因此一我的在事務中讀取到的某個數據,可能下次讀取就變成別的數據啦。這就是不可重複讀的意思。。
可重複讀:也是個讀寫鎖實現,讀鎖會阻塞其餘人(或機器)的寫,因而,只要是事務中讀取到得數據,都被加了鎖,其餘人沒辦法改他們,因而就實現了可重複讀咯。
最後是序列化,就是全部都順序,一個大鎖所有鎖住J
持久性(Durability):持久性就是,事務執行後,就丟不了了,就算是整個中國被淹了,機器都沒了,數據也不該該丟掉(不過基本作不到這個,也就是一個機器掛了不會丟數據而已。。)全部機房沒了那數據也就沒了。。
對於這塊,給你們一些參考資料:
http://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2
http://www.cnblogs.com/wangiqngpei557/archive/2011/11/19/2255132.html
這些講的不錯,淺顯易懂是個人最愛.
好啦,爲了保證我寫的東西不會被」qing」這個大怪獸再次吃掉。。我先發這些。
在下一個章節,咱們繼續在事務這個領域徜徉,給你們介紹一下,在單機上面,事務是如何進行的。