Mysql事務,併發問題,鎖機制

2022-08-27 07:39:15 字數 2401 閱讀 1060

1、什麼是事務

事務是一條或多條資料庫操作語句的組合,具備acid,4個特點。

原子性:要不全部成功,要不全部撤銷

隔離性:事務之間相互獨立,互不干擾

一致性:資料庫正確地改變狀態後,資料庫的一致性約束沒有被破壞

永續性:事務的提交結果,將持久儲存在資料庫中

2、事務併發會產生什麼問題

1)第一類丟失更新:在沒有事務隔離的情況下,兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出, 導致對資料的兩個修改都失效了。

例如:張三的工資為5000,事務a中獲取工資為5000,事務b獲取工資為5000,匯入100,並提交資料庫,工資變為5100,

隨後事務a發生異常,回滾了,恢復張三的工資為5000,這樣就導致事務b的更新丟失了。

2)髒讀:髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。

例如:張三的工資為5000,事務a中把他的工資改為8000,但事務a尚未提交。

與此同時,

事務b正在讀取張三的工資,讀取到張三的工資為8000。

隨後,事務a發生異常,而回滾了事務。張三的工資又回滾為5000。

最後,事務b讀取到的張三工資為8000的資料即為髒資料,事務b做了一次髒讀。

3)不可重複讀:是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第乙個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。

例如:在事務a中,讀取到張三的工資為5000,操作沒有完成,事務還沒提交。

與此同時,

事務b把張三的工資改為8000,並提交了事務。

隨後,在事務a中,再次讀取張三的工資,此時工資變為8000。在乙個事務中前後兩次讀取的結果並不致,導致了不可重複讀。

4)第二類丟失更新:不可重複讀的特例。有兩個併發事務同時讀取同一行資料,然後其中乙個對它進行修改提交,而另乙個也進行了修改提交。這就會造成第一次寫操作失效。 

例如:在事務a中,讀取到張三的存款為5000,操作沒有完成,事務還沒提交。

與此同時,

事務b,儲存1000,把張三的存款改為6000,並提交了事務。

隨後,在事務a中,儲存500,把張三的存款改為5500,並提交了事務,這樣事務a的更新覆蓋了事務b的更新。

3、事務隔離級別,解決什麼併發問題,以及存在什麼併發問題

(1)read_uncommitted

這是事務最低的隔離級別,它充許另外乙個事務可以看到這個事務未提交的資料。

解決第一類丟失更新的問題,但是會出現髒讀、不可重複讀、第二類丟失更新的問題,幻讀 。

(2)read_committed

保證乙個事務修改的資料提交後才能被另外乙個事務讀取,即另外乙個事務不能讀取該事務未提交的資料。

解決第一類丟失更新和髒讀的問題,但會出現不可重複讀、第二類丟失更新的問題,幻讀問題

(3)repeatable_read

保證乙個事務相同條件下前後兩次獲取的資料是一致的

解決第一類丟失更新,髒讀、不可重複讀、第二類丟失更新的問題,但會出幻讀。

(4)serializable

事務被處理為順序執行。

解決所有問題

mysql預設的事務隔離級別為repeatable_read

4、innodb引擎的鎖機制

(之所以以innodb為主介紹鎖,是因為innodb支援事務,支援行鎖和表鎖用的比較多,myisam不支援事務,只支援表鎖)

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

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

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

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

說明:1)共享鎖和排他鎖都是行鎖,意向鎖都是表鎖,應用中我們只會使用到共享鎖和排他鎖,意向鎖是mysql內部使用的,不需要使用者干預。

2)對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖(x);對於普通select語句,innodb不會加任何鎖,事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖。

共享鎖(s):select * from table_name where ... lock in share mode。

排他鎖(x):select * from table_name where ... for update。

3)innodb行鎖是通過給索引上的索引項加鎖來實現的,因此innodb這種行鎖實現特點意味著:只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖!。

事務 鎖 併發 問題

sql server鎖型別 1 holdlock 在該錶上保持共享鎖,直到整個事務結束,而不是在語句執行完立即釋放所新增的鎖。2 nolock 不新增共享鎖和排它鎖,當這個選項生效後,可能讀到未提交讀的資料或 髒資料 這個選項僅僅應用於select語句。3 paglock 指定新增頁鎖 否則通常可能...

mysql樂觀鎖解決併發問題

部落格1 根本決解辦法只有乙個 佇列,別的說的沒有用 部落格2 1 使用版本號實現樂觀鎖 版本號的實現方式有兩種,乙個是資料版本機制,乙個是時間戳機制。具體如下。下單操作包括3步驟 1.查詢出商品資訊 select status,status,version from t goods where i...

事務的併發問題

1 髒讀 事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料 2 不可重複讀 事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。3 幻讀 系統管理員a將資料庫中所有學生的成績從具體分數改為abcde...