Mysql 事務與鎖 例項分析

2021-10-08 18:43:01 字數 3780 閱讀 3687

為了加深對mysql事務和鎖的認識,模擬幾個場景加深印象。

為了方便控制事務,先設定客戶端事務非自動提交:

select @@autocommit;/show variables like '%autocommit%';set @@autocommit=0;

開始模擬幾個場景,並作如下記錄:

1. 開啟兩個事物,update 同一條資料 (x 互斥鎖,導致 wait lock)

下圖中事務tx2 的狀態為 lock_wait ,等待 事務tx1 runniing 中持有的鎖。

下圖中兩條 update語句都加 x 鎖(排他鎖)。update 預設都是互斥x鎖,當記錄加x鎖時,其他事務不允許對此資料集加其他鎖,x 或 s鎖都不允許,所以事務tx2 需要等待 tx1 釋放鎖(commit)之後,才可以對資料集加鎖。

事務tx2 等待鎖時間超過預設 50s,會報錯 lock wait timeout exceeded。

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction  

2. 開啟多個事務, select 顯示加鎖 ,

* 開始事務 tx1 ,select 語句通過 for update 顯示加 x 鎖

* 開始事務tx2/tx3,select 語句通過 for update / lock in share mode  顯示加 x鎖 / s 鎖 

檢視 innodb_trx 事務表 發現  trx_state 的值分別為: tx1 running,tx2 和 tx3 lock wait;

檢視 innodb_locks 鎖表 發現 lock_mode 的值分別為:tx1 -x ,tx2 與 tx3 都為 s;

以上說明,select 顯示加 x 互斥鎖的情況與 udpate 預設互斥鎖是一樣的,顯示加鎖後,其他加鎖操作都需要等待釋放資料集上的鎖。也就是說,如果乙個事務想對乙個資料集加s 或 x 鎖,而這個資料集正在另乙個事務範圍內,並被加x鎖,則其他事務需等待,而預設select 是可以訪問的,因為select沒有鎖的限制,但顯示加鎖的 select 語言需要wait lock,等待這個事務釋放鎖之後,才可以對資料集進行操作。

innodb與myisam的最大不同有兩點:一是支援事務(transaction);二是採用了行級鎖

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

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

共享鎖 s 與 讀鎖 x:共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。

排他鎖就是不能與其他所並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的任何鎖,包括共        享鎖和排他鎖,但是獲取排他鎖的事務是可以對資料就行讀取和修改。

加鎖 /如何加鎖:

問題:

select ... lock in share mode 獲得共享鎖 s,主要用在需要資料依存關係時來確認某行記錄是否存在,並確保沒有人對這個記錄進行update或者delete操作。

** 但是如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖,對於鎖定行記錄後需要進行更新操作的應用,應該使用 select ...for updat方式獲得排他鎖 x.

在mvcc(多版本並非控制)中,讀操作可以分成兩類

快照讀 (snapshot read)與當前讀 (current read)

簡單的select操作,屬於快照讀,不加鎖。

select * from table where ?;

下面語句都屬於當前讀,讀取記錄的最新版本。且讀取後,還需要保證其他併發事務不能修改當前記錄,對讀取記錄加         鎖。以下除了第一條語句,對讀取記錄加s鎖 (共享鎖)外,其他的操作,都加的是x鎖 (排它鎖)。

select * from table where ? lock in share mode; // 顯示加 s 鎖

select * from table where ? for update; // 顯示加 x 鎖

insert into table values (…); // 自動加 x 鎖

update table set ? where ?; // 自動加 x 鎖

delete from table where ?; // 自動加 x 鎖

事務隔離制度:資料庫的事務隔離越嚴格,併發***越小,但付出的代價也就越大,因為事務隔離實質上就是使事務在一定程度上 「序列化」進行,這顯然與「併發」是矛盾的。同時,不同的應用對讀一致性和事務隔離程度的要求也是不同的,比如許多應用對「不可重複讀」和「幻讀」並不敏 感,可能更關心資料併發訪問的能力。

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

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

MYSQL 事務與鎖

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

mysql的事務,隔離級別和鎖用法例項分析

事務就是一組一起成功或一起失敗的sql語句。事務還應該具備,原子性,一致性,隔離性和永續性。一 事務的基本要素 acid 1 原子性 事務開始後,所有的操作,要麼全部成功,要麼全部失敗,不可能處於中間狀態,事務是乙個不可分割的整體,就像原子一樣。2 一致性 事務開始前和結束後,資料庫的完整性約束沒有...