c 併發操作mysql 資料庫的併發操作

2021-10-17 20:48:29 字數 2927 閱讀 9750

資料庫的併發操作

事務事務(transaction)是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的工作單位。

事務是恢復和併發控制的基本單位

事務的acid特性:

原子性(atomicity):事務是資料庫的邏輯工作單位

一致性(consistency):事務執行的結果必須是使資料庫從乙個一致性狀態變

到另乙個一致性狀態

隔離性(isolation):乙個事務的執行不能被其他事務干擾

持續性(durability ):乙個事務一旦提交,它對資料庫中資料的改變就應該

是永久性的。

併發控制

事務是併發控制的基本單位

併發控制機制的任務

對併發操作進行正確排程

保證事務的隔離性

保證資料庫的一致性

併發操作帶來的資料不一致性

丟失修改(lost update)

不可重複讀(non-repeatable read)

幻讀(phantom read)

讀「髒」資料(dirty read)

丟失修改:兩個事務t-1和t-2讀入同一資料並修改,t-2的提交結果破壞了t-1提交 的結果,導致t-1的修改被丟失。(修改-修改衝突)

不可重複讀:事務1讀取某一資料,事務2對其做了修改;當事務1再次讀該資料 時,得到與前一次不同的值(讀-更新衝突)

幻讀:事務t-1按一定條件從資料庫中讀取了某些資料記錄,事務t-2刪除(插入)了其中部分記錄 ,當t-1再次按相同條件讀取資料時,發現某些記錄神秘地消失(出現)了。(讀-插入/刪除衝突)

髒資料: 事務t-1修改某一資料,並將其寫回磁碟;事務t-2讀取同一資料後,t-1由於某種原因被撤銷這時t-1,已修改過的資料恢復原值,t-2讀到的資料就與資料庫中的資料不一致t-2讀到的資料就為「髒」資料,即不正確的資料(修改-讀衝突)

資料不一致性:由於併發操作破壞了事務的隔離性

併發控制就的目的就是要用正確的方式排程併發操作,使乙個使用者事務的執行不受其他事務的干擾,從而避免造成資料的不一致性

併發控制的主要技術

封鎖(locking)

時間戳樂觀控制法

多版本併發控制

封鎖封鎖:封鎖就是事務t在對某個資料物件(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖

封鎖是實現併發控制的乙個非常重要的技術

基本封鎖型別

排它鎖(exclusive locks,簡記為x鎖)又叫寫鎖

共享鎖(share locks,簡記為s鎖)又叫讀鎖

排它鎖:若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其它任何事務都 不能再對a加任何型別的鎖,直到t釋放a上的鎖保證其他事務在t釋放a上 的鎖之前不能再讀取和修改a

共享鎖:若事務t對資料物件a加上s鎖,則事務t可以讀a,但不能修改a,其它事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖,保證其他事務可以讀a,但在t釋放a上的s鎖之前,不能對a做任何修改

封鎖協議

封鎖協議:在運用x鎖和s鎖對資料物件加鎖時,需要約定一些規則,這些規則為locking protocol

對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議,在不同的程度上保證併發操作的正確排程。

封鎖協議決定了事物的隔離級別。

**封鎖協議

一級封鎖協議

二級封鎖協議

**封鎖協議

一級封鎖協議:事務t在修改資料r之前必須先對其加x鎖,直到事務結束才釋放。

​ 正常結束(commit)

​ 非正常結束(rollback)

一級封鎖協議可防止丟失修改,並保證事務t是可恢復的,它不能保證可重複讀和不讀「髒」資料。

二級封鎖協議:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完 後即可釋s鎖。

二級封鎖協議可以防止丟失修改和讀「髒」資料

**封鎖協議:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放。

**封鎖協議可防止丟失修改、讀髒資料和不可重複讀。

事務的四個隔離級別

mysql中的隔離級別有四種:

封鎖的粒度

封鎖物件的大小稱為封鎖粒度(granularity)

封鎖的物件:邏輯單元,物理單元

邏輯單元: 屬性值、屬性值的集合、元組、關係、索引項、整個索引、整個資料庫等

物理單元:頁(資料頁或索引頁)、物理記錄等

封鎖粒度與系統的併發度和併發控制的開銷密切相關。

封鎖的粒度越大,資料庫所能夠封鎖的資料單元就越少,併發度就越小,系統開銷也越小;

封鎖的粒度越小,併發度較高,但系統開銷也就越大

表鎖:封鎖粒度為表(關係)的鎖

行鎖:封鎖粒度為行(元祖)的鎖

悲觀鎖與樂觀鎖

(1)悲觀鎖:顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

(2)樂觀鎖: 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

(3)悲觀鎖 和 樂觀鎖的區別:

樂觀鎖在不發生取鎖失敗的情況下開銷比悲觀鎖小,但是一旦發生失敗回滾開銷則比較大,因此適合用在取鎖失敗概率比較小的場景,可以提公升系統併發效能

樂觀鎖還適用於一些比較特殊的場景,例如在業務操作過程中無法和資料庫保持連線等悲觀鎖無法適用的地方

c 操作mysql資料庫

include include stdio.h include winsock.h include mysql.h int main else else sprintf tmp,update s set 商品 s 賣出 d,成交 d,漲跌 d,買進 d,總量 d,漲幅 f,時間 s where s ...

c 操作MySql資料庫

需要mysql.data.dll 資料庫連線 server資料庫位址,user資料庫使用者名稱,password密碼,database資料庫名 string connectstring string.format server user id password database server,use...

C 操作MYSQL資料庫

1.安裝mysql 略2.建立c 控制台程式,新建cpp原始檔,如 sqlconn.cpp 3.在工程專案中屬性 c c 常規 附加包含目錄中新增mysql安裝目錄中的mysql mysql mysql server 5.7 include 4.新增庫目錄 5.新增依賴項 libmysql.lib ...