資料庫隔離與鎖知識點彙總

2021-10-09 02:38:19 字數 2049 閱讀 4332

1、原子性:事務中的所有操作要麼不執行,要麼都執行

2、一致性:資料遵循守恆,a向b轉了100,事務結束後必定是a少了100,b多了100

3、隔離性多個事務併發執行的化,必定和穿行執行的效果一樣

4、永續性:事務在執行結束後,對資料庫的影響是永久的

1、髒讀:不同事務,乙個事務讀了另乙個事務沒有提交的資料

2、不可重複讀:多次讀取同乙個資料的結果不一樣。即在連續的倆次讀取之間,有一事務對這一資料做了修改並提交了

3、幻讀:一事務對錶某範圍的資料做修改,另一事務對該錶做插入,插入的資料剛好符合上一事務的範圍,上一事務的使用者發現還有沒有修改的資料。

1、讀未提交:讀到沒有提交的資料。存在髒讀,幻讀,不可重複讀問題

2、讀提交:只能讀到已經提交的資料。存在不可重複讀,幻讀問題

3、可重複度:事務開啟時就不允許對該資料做修改操作,即給第乙個updata操作加行鎖。存在幻讀問題,因為幻讀是對資料刪除或者修改。(mysql預設級別)

4、序列化:乙個事務執行完了另乙個事務才能執行。解決三個問題,但是效率奇差。

1、行鎖:阻塞一行,對其他行沒影響

一、按讀寫分類

1、讀鎖(s鎖):共享鎖,加鎖後,其他事物可以讀,可以加讀鎖但不可以寫,不可以加寫鎖

select。。。lock in share mode

將查詢到的資料加讀鎖,其他事務可以查到該資料,並也可以給這條資料加讀鎖。

應用場景:讀出資料後,其他事務不能修改,但自己也不一定能修改,因為其他事務也可以加讀鎖。

2、寫鎖:排他鎖。加鎖後其他事務不能加讀鎖也不能加寫鎖。但是select可以通過。

select。。。for update

另外,insert,update,delete也加了寫鎖

應用場景:只有自己這個事務可以修改該資料。

事務commit或rollback就可釋放鎖

可重複讀級別下for update解決幻讀:

事務查詢select。。。for update並用到索引,會對查到的字段和間隙加寫鎖。沒用到索引,會對錶中所有記錄及間隙加寫鎖,因為不加鎖你會修改某一行使之滿足查詢條件,再次查詢的時候依然會產生幻讀現象

1.當begin乙個事務,第一次查詢乙個資料,這個資料的值一定是剛剛其他事務提交後的值。也就是說已經開啟了乙個事務,在沒有select的情況下,其他事務修改了a的值並提交,這時執行這個事務第乙個select,查詢這個a,a的值就是剛剛那個事務提交的,而不是事務開啟時a的值。select後會對a建立了乙個快照,緊接著的select會直接找快照中的,而不是資料庫的

紅色的標號表示sql執行順序。

例子中事務開啟時,a的值是4,之後其他事務給a-1;左邊的事務select,值為當前資料庫的值

2.之後再對a updata,updata的對像是資料庫中的a,而不是mvcc建立的快照快取中的a,也就是說,當事務update,mvcc會更新快照。比如快照中a的值時200,其他事務對a減了50並提交,資料庫a的值就是150了,原先的事務在updata a-50,這時就會以資料庫的值150,做操作,select一下時100,然後mvcc有建立了乙個新的對a的快照版本。(有可能錯誤,僅供參考)

接著上乙個例子,開始資料庫的值為3,左邊事務更新並提交,此時資料庫a為2,右邊事務再更新,a的值是當前資料庫中a的值2,而不是3;

其實mvcc會維護乙個儲存了當前活躍事務id的陣列,當事務update的時候,mvcc會增加乙個快照版本,當事務提交之後,就會從活躍事務id的陣列中刪除。

而該事務沒更新,不管其他事務如何更新,該事務的a永遠是當前版本的a。我覺得第一次事務快照的版本是根據事務第一次使用select的值建立的。

資料庫事務隔離級別

資料庫事務隔離,髒讀、幻讀、不可重複讀

資料庫知識點之 悲觀鎖與樂觀鎖

在實際的開發過程中,我們應該經常用到悲觀鎖。以前一直沒關注理論,只是在實踐中,今天搜尋了下,其實就是對這兩個名詞的概念解釋。悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到...

資料庫面試知識點彙總 三

1.什麼是索引?何為索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。2.索引的作用?...

資料庫知識點

1.truncate delete和drop delete delete是一行行刪除資料,不影響表結構,並且會記錄日誌,可以進行回滾。truncate 刪除表中所有資料,不記錄日誌,不可以回滾,truncate之後表空間和索引大小會回到初始值。所以truncate之前最好備份 drop 刪除整個表結...