事務的隔離級別
事務隔離級別的實現——mvcc
mvcc的缺點
事務的四大特性是老生常談的問題了:依次是a(原子性)、c(一致性)、i(隔離性)、d(永續性)。
a事務讀到了回滾的b事務修改的資料。即b事務修改了資料,這個時候a事務讀到了修改的資料,但是b事務這個時候回滾了。a事務讀到的資料就是髒資料,稱為髒讀。
就是乙個事務 多次讀資料發現讀到的結果不一致,因為再事務執行的時候其他事務修改了資料。
即某個事務對某個範圍內的資料進行修改,但是其他事務中間插入了一行資料,這個時候就會出現幻影行,稱為幻讀。
事務存在四種隔離級別:讀已提交,讀未提交,可重複讀,序列化。
這種事務隔離級別指的是事務的每一步改變對於其他事務都是可見的,這種隔離級別的隔離性最弱,一般使用的比較少。三種情況都不可避免。
這種事務隔離級別指的是事務對資料的修改只有提交後才對其他事務可見,這種級別解決了髒讀問題,但是卻沒有解決不可重複讀和幻讀的問題。
這種事務隔離級別指的是事務執行期間看到的資料庫檢視和開始看到的檢視總是一致的。可以解決髒讀和不可重複度的問題,但是無法解決幻讀的問題,但是innodb引擎採用了mvcc來解決了這個問題。這也是mysql預設的事務隔離機制。
序列化是一種強制的加鎖策略,即讀加讀鎖,寫加寫鎖。當出現讀寫衝突的時候,後訪問的事務必須等到前乙個事務釋放鎖,才能繼續執行。可以解讀髒讀、不可重複讀以及幻讀的問題。
在mysql中,每個記錄在進行更新的時候會同時記錄一條回滾操作,乙個資料會儲存多個版本,這就是資料庫的(多版本併發控制)mvcc。在高效能mysql這本書裡面有提到,mvcc實現的是,相同事務不同時刻看到的資料庫一致,不同事務在相同時刻看到的資料庫不一致。mvcc不是mysql獨有的,orcale和sql server也支援mvcc。
mvcc是在可重複讀和讀已提交中使用的技術。其中採用了檢視的概念來支援mvcc的實現。對於讀已提交來說使用的是當前操作的檢視,對於可重複讀來講,使用的是事務開始的時候的檢視。
這裡以innodb為例,innodb採用了快照來實現mvcc,即為每行的資料增加兩個預設字段,乙個是建立時間,另外乙個是刪除時間。每次資料庫進行改變的時候都只會改變當前版本之前的資料。同時使用了gap鎖來時解決了幻讀問題。
gap鎖又稱間隙鎖,是innodb引擎用來解決幻讀問題的鎖。即在兩個資料之間進行加鎖,例如mysql中有3條資料那麼就會加上四個就間隙鎖,因為存在四個間隙(兩端的也算)。同時gap鎖和右側相鄰的行鎖構成next-key鎖,next-key鎖是左開右閉的。同時gap鎖之和向這個gap中插入資料這件事情衝突,和其他的gap鎖把並不衝突。
innodb只會對查詢過程中訪問的資料進行加鎖,加鎖的力度預設是next-key,前開後閉。當是索引上的等值查詢的時候,給唯一索引加鎖時,會退化為行鎖,而向右遍歷到最後乙個不滿足條件的值的時候next-key鎖退化為gap鎖。
由於mvcc會找合適的資料版本,所以可能還會導致版本號過多的情況下資料庫的資料版本過多情況下sql變慢。
了解一下NTLM
ntlm 在客戶機與伺服器之間提供身份認證的安全包。ntlm 身份驗證協議 是 質詢 應答身份驗證協議,是windows nt 4.0 及其早期版本中用於網路身份驗證的預設協議。windows 2000 中仍然支援該協議,但它不再是預設的。ntlm身份驗證過程 ntlm 是用於 windows nt...
了解一下 display flex
一 display flex flex 是flexuble box的縮寫,意為 彈性盒子 用來為盒狀模型提供最大的靈活性.任何乙個容器都可以指定為flex布局.box 行內元素也可以使用flex布局.box webkit核心的瀏覽器,必須加上 webkit box 注意為父級設計flex布局以後,子...
指標了解一下
在c語言中,我們會頻繁的使用指標,那麼什麼是指標?首先我們來看一段 include int main 假如建立的變數a的位址為0x0000ff11,那麼指標變數指向變數a,存放的是變數a的位址。總結 指標就是位址,指標變數是變數,指標變數是用來儲存位址的變數。存放在指標變數中的值都會被當做位址來處理...