關係型資料庫(二)

2021-09-23 07:47:46 字數 2662 閱讀 8868

innodb預設用的是行級鎖,也支援表級鎖,不使用索引的時候用的是表級鎖。

myisam預設用的是表級鎖,不支援行級鎖。

共享鎖(s)

排他鎖(x)

意向共享鎖(is)

意向排他鎖(ix)

共享鎖(s)

相容衝突

相容衝突

排他鎖(x))

衝突衝突

衝突衝突

意向共享鎖(is)

相容衝突

相容相容

意向排他鎖(ix)

衝突衝突

相容相容

按鎖的粒度劃分,可分為表級鎖、行級鎖、頁級鎖

按鎖級別劃分,可分為共享鎖、排他鎖

按加鎖方式劃分,可分為自動鎖、顯式鎖 (for update 、lock in share mode)

按操作劃分,可分為dml鎖(資料操作時加的鎖)、ddl鎖(表結構變更加的鎖)

按使用方式劃分,可分為樂觀鎖、悲觀鎖

原子性(atomic):事務包含的所有操作要麼全部執行,要麼全不執行,失敗回滾

一致性(consistency):資料能夠滿足完整性約束,兩個有關聯的資料,乙個改變,另乙個也隨之改變

隔離性(isolation):當多個使用者併發訪問資料 庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務操作所干擾,多個併發事務之間要相互隔離

永續性(durability):指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作

一、事務併發訪問引起的問題

更新丟失(lost update):兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出,導致對資料的兩個修改都失效了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。

髒讀(dirty read):又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。例如:事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因回滾了,那麼事務t2讀取的資料就是髒的。

不可重複讀(non-repeatable read):是指在乙個事務中兩次讀同一行資料,可是這兩次讀到的資料不一樣。例如:事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

幻讀:事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢**現的資料。

例如:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。

不可重複讀側重於對同一資料的修改,幻讀側重於對資料的新增或刪除。

二、事務的隔離級別

以上的4種問題(更新丟失、髒讀、不可重複讀、幻讀)都和事務的隔離級別有關。通過設定事務的隔離級別,可以避免上述問題的發生。

讀未提交(read uncommitted):讀事務不阻塞其他讀事務和寫事務,未提交的寫事務阻塞其他寫事務但不阻塞讀事務。此隔離級別可以防止更新丟失,但不能防止髒讀、不可重複讀、幻讀。此隔離級別可以通過「排他寫鎖」實現。

讀已提交(read committed):讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。此隔離級別可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。

可重複讀取(repeatable read):以操作同一行資料為前提,讀事務禁止其他寫事務但不阻塞讀事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。此隔離級別可以通過「共享讀鎖」和「排他寫鎖」實現。

序列化(serializable):提供嚴格的事務隔離,它要求事務序列化執行,事務只能乙個接著乙個地執行,不能併發執行。此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免更新丟失、髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

當前讀:加了鎖的增刪改查語句,像select … lock in share mode,select … for update;update,delete,insert;讀取當前記錄的最新版本,並且保證其他併發事務不能修改當前記錄。

快照讀:不加鎖的非阻塞讀,select;在serializable級別的快照讀也變成為當前讀;

next-key鎖(行鎖+gap鎖),gap鎖(間隙鎖)目的是防止同一事務的兩次當前讀出現幻讀的情況。

對主鍵索引或者唯一索引會用gap鎖嗎?

如果where條件全部命中,不會用gap鎖,只會加記錄鎖;

如果where條件部分命中或全都不命中,會加gap鎖;

gap鎖出現在非唯一索引或不走索引的當前讀中

關係型資料庫 非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...

關係型資料庫 非關係型資料庫

2019 02 25 20 38 36 關係型資料庫和非關係型資料的比較 一 關係型資料庫 關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的乙個資料組織 優點 1 易於維護 都是使用表結構,格式一致 2 使用方便 sql語言通用,可用於複雜查詢 3 複雜操作 支援sql,可用於乙個表...

(二)關係型資料庫

是一種建立在關係模型上的資料庫 關係模型,一種建立在關係上的模型 關係模型包含三個方面 關係型資料庫 從需要儲存的資料需求中進行分析,如果是一類資料 實體 應該設計成一張二維表 表 由表頭 欄位名 用來規定資料的名字 和資料部分 實際儲存的資料單元 組成 二維表 行和列 表頭欄位名1 欄位名2 資料...