了解悲觀鎖和樂觀鎖的概念
悲觀鎖:假設會發生併發衝突,迴避一切可能違反資料完整性的操作。
樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性,注意樂觀鎖並不能解決髒讀的問題(關於髒讀稍後解析)。
在一般情況下,悲觀鎖依靠資料庫的鎖機制實現,以保證操作最大程度的排他性和獨占性,因而會導致資料庫效能的大量開銷和併發性很低,特別是對長事務而言,這種開銷往往過於巨大而無法承受。為了解決這樣的問題,樂觀鎖機制便出現了。
樂觀鎖,大多情況下是基於資料版本( version )記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 「version」 欄位來實現。讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則給予更新,否則認為是過期資料。ok~,關於悲觀鎖和樂觀鎖的簡單概念就先了解到這。
mysql中的共享鎖與排他鎖(屬於悲觀鎖,行鎖定)
在mysql中,為了保證資料一致性和防止資料處理衝突,引入了加鎖和解鎖的技術,這樣可以使資料庫中特定的資料在使用時不讓其他使用者(程序或事務)操作而為該資料加鎖,直到該資料被處理完成後再進行解鎖。根據使用目的不同把鎖分為共享鎖定(也稱為讀取鎖定)和排他鎖定(寫入鎖定)。
共享鎖定:將物件資料變為唯讀形式的鎖定,這樣就允許多方同時讀取乙個資料,此時資料將無法修改。
排他鎖定:在對資料進行insert/update/delete時進行鎖定,在此時其他使用者(程序或事務)一律不能讀取資料,從而也保證資料完整性。
以上兩種鎖都屬於悲觀鎖的應用,還有一點,根據鎖定粒度的不同,可分為行鎖定(共享鎖和排他鎖使用應用的就是行鎖定),表鎖定,資料庫鎖定,可見粒度的不同將影響使用者(程序或事務)對資料操作的併發性,目前mysql支援行鎖定和表鎖定。
事務處理分離水平
事實上,鎖的出現更多的是為了在多個使用者(程序或事務)同時執行更新操作時保證資料的完整性和一致性,但隨之而來的問題是當資料的鎖定時間越長,資料同時執行性也會隨之降低。也就意味著當乙個使用者(程序或事務)對資料儲存鎖定時,其他使用者(程序或事務)只能等待鎖定解鎖,這樣也就導致併發訪問該資料的同時性較低。所以在多使用者(程序或事務)對資料進行更新或者訪問的同時如何保證資料的完整性和一致性,這樣的情況下需要有乙個相對折中的妥協,因為並不是頻繁鎖定資料或者極致提供同時執行性就是合理的,為了描述這個問題資料庫中引入分離水平(有些地方稱為隔離級別)的概念來確定事務處理之間的相互影響程度。其規則描述:分離水平越高,資料的完整性也就越高,但同時執行性下降,相反如果分離水平越低資料完整性越低,同時執行性也就提高了。在典型的應用程式中,多個事務併發執行,經常會操作相同的資料來完成各自的任務,併發雖然是常見的,但可能會導致不同分離水平下發生不同的資料讀取情況,4種分離水平以及可能導致的情景如下:
分離水平
讀未提交(髒讀)
不可重複讀
幻讀read uncommitted會會
會read committed不會
會repeatable read不不
會serializable不不
不 四種分離水平(隔離級別)
read_uncommitted:這是事務最低的分離水平(隔離級別),它充許別外乙個事務可以看到這個事務未提交的資料,會出現髒讀、不可重複讀、幻讀 (分離水平最低,併發效能高)
read_committed:保證乙個事務修改的資料提交後才能被另外乙個事務讀取。另外乙個事務不能讀取該事務未提交的資料。可以避免髒讀,但會出現不可重複讀、幻讀問題(鎖定正在讀取的行,多數資料庫預設隔離級別,不是mysql)
repeatable_read:可以防止髒讀、不可重複讀,但會出幻讀(鎖定所讀取的所有行)
serializable:這是花費最高代價但是最可靠的事務分離水平(隔離級別),事務被處理為順序執行。保證所有的情況不會發生(鎖表,併發性及其低)
mysql 鎖 事務隔離級別
最近在看mysql相關的書籍.實驗了一些內容.分享一下,主要是關於事務隔離級別 read committed和repeatable read 和鎖相關的.很多網上文章上都能搜尋到 read committed可以防止髒資料.但是不能防止 不可重複讀.而repeatable read可以防止 不可重複...
MySQL鎖與事務隔離
1.排他鎖 x鎖 解決多個程式同時修改乙個資料,造成的資料丟失問題。read uncommitted 讀未提交 存在髒讀問題 2.共享鎖 s鎖 解決髒讀問題 甲修改了資料,卻沒有將資料提交或回滾了資料,乙讀到了甲修改後的 錯誤的資料 而不是資料庫中現在真實存在的資料約定 read committed...
MySql各事務隔離級別及鎖問題
聊事務隔離級別和鎖問題之前首先得理解事務的隔離級別和共享鎖及獨佔鎖的概念 事務的隔離級別 髒讀不可重複讀 幻讀read uncommitted read committed repeatable read serializable 獨佔鎖 x鎖 獨佔鎖也叫排他鎖,是指該鎖一次只能被乙個執行緒所持有。...