mysql沒有事務死鎖 Mysql事務與死鎖

2021-10-17 15:30:54 字數 2136 閱讀 4587

好久沒有寫部落格了,最近工作太忙了,真的是996icu呀。想找個機會跳出來。之後我要做到work life balance!

當考慮的就是資料一致性的問題時我們用就應該想到mysql的事務。但是當我們使用事務時會有很多的坑,首先我們了解一下事務的隔離界別。

1、事物的隔離級別

資料庫中有四種資料隔離級別

read uncommited(未提交讀) 在read uncommited級別,事務中的修改,即便沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也成為髒讀(dirty read)。這個級別會導致很多問題,從效能上說,read uncommited不會比其他的級別好太多,但缺乏其他級別的很多好處,除非真的非常有必要的理由,在實際應用中一般很少使用。

read commited(提交讀) 大多數資料庫系統的預設隔離級別都是read commited(mysql除外)。read commited滿足前面提到的個理性的簡單定義:乙個事務開始時,只能「看見」已經提交的事務所做的修改。換句話說,乙個是無從開始直到提交之前,所做的任何修改對其他事務是不可見的。這個級別有時候也叫不可重複讀(nonrepeatable read),因為兩次執行同樣的查詢,可能結果的不到一樣的效果。

repeatable read(可重複讀) repeatable read解決了髒讀的問題。該級別保證了在同一事務中多次讀取同樣資料的結果是一致的。但理論上,可重複讀隔離級別還是無法解決另外乙個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀某個範圍內的記錄時,會產生幻行(phantom row)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和xtradb儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)解決了幻讀的問題。

serializable(可序列化) serializable是最高的隔離級別。他通過強制事務序列執行,避免了前面說的幻讀的問題。簡單地說,serializable會在讀取每一行資料上都加鎖,說以可能導致大量的超時和競爭鎖的問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保資料一致性而且可以接受沒有併發的情況下,才會考慮採用該級別。

隔離級別

髒讀可能性

不可重複讀可能性

幻讀可能性

加鎖讀read uncommited

yesyes

yesno

read commited

noyes

yesno

repeatable read

nono

yesno

serializable

nono

noyes

2、死鎖

說完隔離級別,我們看看鎖的問題。

死鎖是指兩個或者多個事務在統一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈的現象。當多個事務試圖以不同的順序鎖定資源時,就可能產生死鎖。多個事務同時鎖定同一資源時,也會產生死鎖。

那麼什麼情況下會造成死鎖?

所謂死鎖: 是指兩個或兩個以上的程序在執行過程中, 因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去. 此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的程序稱為死鎖程序. 表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的innodb.

例子事務1:start transaction;

update cwb set age = 12 where id = 4 and date = '2019-05-08';

update cwb set age = 13 where id = 3 and date = '2019-05-09';

commit;事務2:start transaction;

update cwb set age = 14 where id = 3 and date = '2019-05-09';

update cwb set age = 15 where id = 4 and date = '2019-05-08';

commit;

如果湊巧,兩個事務都執行了第一條update語句,更新了第一行資料,同時也鎖定了該行資料,接著每個事務都嘗試去執行第二條update語句,去發現該行已經被對方鎖定,然後兩個事務都等待對方釋放鎖,同時又持有對方所需要的鎖,則陷入死迴圈。除非外部因素介入才有可能解除死鎖。

唯讀事務和沒有事務

在專案中看到 transactional readonly true 註解 該屬性用於設定當前事務是否為唯讀事務,設定為 true 表示唯讀,false 則表示可讀寫,預設值為 false 例如 transactional readonly true 了解到是唯讀事務,網上搜了下唯讀事務和沒有事務的...

mysql事務死鎖 MySQL事務 死鎖

一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...

MySQL 5 6的GTID複製報錯沒有事務號

mysql 5.6的gtid複製有如下的報錯 worker 3 failed executing transaction at master log mysql bin.000014,end log pos 1216 error can t drop database xiao database d...