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 結束事務。事務的隔離級別 讀未提交 存在的問題 髒讀 不可重複讀...