mysql的事務與鎖的實現方式 mysql事務與鎖

2021-10-18 05:46:08 字數 2577 閱讀 3541

1、innodb 支援事務、行級鎖。

acid:

a(atomicity)原子性:要麼全部成功,要麼全部失敗。

i(isolation)隔離性:兩個事務之間的相互影響。

d(durable)永續性:事務完成後,資料修改永久性。

2、併發事務帶來的問題

1、更新丟失:兩個事務同時更新一行,由於每個事務不知道其他事務的存在,就會發生更新丟失的問題,最後的更新覆蓋了由其他事務所做的更新。

2、髒讀:乙個事務在對於一條記錄做修改,未完成之前,這條記錄就處於不一致的狀態,此時,另乙個事務也來讀取同一條記錄,讀到的為髒資料。

(此時事務未提交,則讀取的資料為修改前的資料)。

3、不可重複讀:乙個事務在讀取某些資料後的某個時間,再次讀取以前讀過的資料,卻發現資料發生了改變或被刪除。

4、幻讀:乙個事務按相同的查詢條件重讀以前檢索過的資料,卻發現其他事務插入了滿足了其查詢條件的新資料,稱為幻讀。

3、事務隔離級別

1、更新丟失:應用的責任

2、髒、不可重複、幻:事務隔離機制

3、實現方式:加鎖、多版本併發控制

隔離級別                    髒     不可重複     幻

read uncommitted     是         是          是

read committed         否         是          是

repeatable read         否        否           是

serializable                否         否          否

4、查詢事務的一些命令

1、檢視當前會話的隔離級別:select @@ tx_isolation;

2、檢視當前系統的隔離級別:select @@global.tx_isolation;

3、設定當前會話的隔離級別:set session transaction isolation level repeatable read;

4、設定當前系統的隔離級別:set global transaction isolation level repeatable read;

5、命令列,開始事務時:set autocommit=off  ;  or  start transaction ;

5、innodb 行鎖模式及加鎖方式

共享鎖:允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。

排他鎖:允許獲得排他鎖的事務更新資料,阻止其他事務取得相同資料集共享讀鎖和排他寫鎖。

如果乙個事務請求的鎖模式與當前鎖相容,innodb就將請求的鎖授予該事務,反之,如果不相容,該事務就要等待鎖釋放。(只有當前是共享鎖,請求是共享鎖時相容)。

6、表鎖

意向共享鎖(is):事務打算給資料行加行共享鎖,事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。

意向排他鎖(xs):事務打算給資料行加行排他鎖,事務在給乙個資料行加排他鎖前必須先取得該錶的xs鎖。

意向鎖是innodb自動加的,不需要使用者干預,對於update、delete、insert語句,innodb會自動給涉及的資料集加排他鎖。對於普通的select語句,

innodb不會加任何鎖。

事務顯示加鎖:

s:select * from table where ..lock in share mode.

x:select * from table where ..for update.

共享鎖主要用在需要資料依存關係時來確認某行記錄是否存在,並確認沒人對這條記錄進行update或delete操作,如果當前事務也需要對該記錄進行更新操作,

則很可能造成死鎖。對於鎖定行記錄後需要更新操作的應用,應該使用select..for update方式獲得排他鎖。

7、innodb行鎖實現方式

innodb行鎖是通過給索引項加鎖來實現的。這一點mysql與oracle不同,後者是通過資料塊中對相應的資料行加鎖來實現的。

innodb這種行鎖意味著,只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖。

是否走索引由執行計畫決定,對於一些小表,即使條件中使用了索引字段,有可能走全表掃瞄,此時innodb將使用表鎖。

8、mysql常用的命令

show processlist 顯示哪些執行緒在執行

show full processlist

show open tables

show status like '%lock%'  檢視伺服器狀態

show engine innodb status\g; innodb引擎執行資訊

show variables like '%timeout%' 查詢伺服器配置引數

9、mysql查詢表死鎖 結束死鎖的表步驟

是否鎖表:show open tables where in_use>0

查程序:show processlist -> kill id

正在鎖的事務:select * from information_schema.innodb_locks;

等待鎖的事務:select * from information_shcema.innodb_lock_waits;

mysql事務的實現方式 mvvc 鎖

1.什麼是mvvc 條件 1.1只有在innodb引擎下存在的一種基於多版本的併發控制協議 1.2mvcc只在 read committed 和 repeatable read 兩個隔離級別下工作。其他兩個隔離級別夠和mvcc不相容,因為 read uncommitted 總是讀取最新的資料行,而不...

mysql事務與鎖機制 mysql事務與鎖機制

在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...

MYSQL 事務與鎖

事務的特性 acid 原子性一致性 隔離性永續性 通過redolog 和 doublewrite 頁損壞的情況 實現永續性 事務什麼時候開啟 預設自動開啟,自動提交。通過begin 命令顯式開啟事務 通過commit rollback 結束事務。事務的隔離級別 讀未提交 存在的問題 髒讀 不可重複讀...