MySQL在預設事務下各SQL語句使用的鎖分析

2022-02-26 13:36:26 字數 1734 閱讀 2226

資料庫使用鎖是為了支援更好的併發,提供資料的完整性和一致性。innodb是乙個支援行鎖的儲存引擎,鎖的型別有:共享鎖(s)、排他鎖(x)、意向共享(is)、意向排他(ix)。為了提供更好的併發,innodb提供了非鎖定讀:不需要等待訪問行上的鎖釋放,讀取行的乙個快照。該方法是通過innodb的乙個特性:mvcc來實現的

innodb有三種行鎖的演算法:

1,record lock:單個行記錄上的鎖。

2,gap lock:間隙鎖,鎖定乙個範圍,但不包括記錄本身。gap鎖的目的,是為了防止同一事務的兩次當前讀,出現幻讀的情況。

3,next-key lock:1+2,鎖定乙個範圍,並且鎖定記錄本身。對於行的查詢,都是採用該方法,主要目的是解決幻讀的問題。

如果採用mysql預設的事務隔離級別(可以重複讀:repeatable read

可重複讀取(repeatable read):防止(避免)不可重複讀取和髒讀,但是有時可能出現幻讀資料。這可以通過「共享讀鎖」和「排他寫鎖」實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

>是乙個快照讀,通過讀取資料庫的乙個快照,不會加任何鎖,除非將隔離級別設定成了 serializable 。

>在所有索引掃瞄範圍的索引記錄上加上共享的next key鎖;如果是唯一索引,只需要在相應記錄上加index record lock。這些被共享lock住的行無法進行update/delete。

>允許其它事務對這些記錄再加share鎖

>如果沒有使用到索引,則鎖住全表(表級的排他鎖),無法進行insert/update/delete。

>在所有索引掃瞄範圍的索引記錄上加上排他的next key鎖。如果是唯一索引,只需要在相應記錄上加index record lock。

>如果沒有利用到索引將鎖住全表(表級的排他鎖),其它事務無法進行insert/update/delete操作。

>在所有索引掃瞄範圍的索引記錄上加上排他的next key鎖。如果是唯一索引,只需要在相應記錄上加index record lock。

>如果沒有利用到索引將鎖住全表(表級的排他鎖),其它事務無法進行其他的insert/update/delete操作。;

>語句在所有索引掃瞄範圍的索引記錄上加上排他的next key鎖。如果是唯一索引,只需要在相應記錄上加index record lock。

>如果沒有利用到索引將鎖住全表(表級的排他鎖),其它事務無法進行其它的insert/update/delete操作。

>在插入的記錄上加一把排他鎖,這個鎖是乙個index-record lock,並不是next-key 鎖,因此就沒有gap 鎖,他將不會阻止其他會話在該條記錄之前的gap插入記錄。

總結:

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed

,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

mysql查詢未提交事務的sql語句

mysql查詢未提交事務的sql語句,找出未提交事務執行的sql語句 mysql開啟事務後沒有提交就退出,事務長時間running狀態,程序又處於sleep狀態,有可能後續導致其他事物超時失敗 能找到事物執行的sql語句的話就很容易定位到程式中錯誤的 檢視所有事務 檢視程序資訊 查詢程序狀態,發現s...

SQL語句在MySQL中的執行流程

本篇文章分析sql語句在mysql中的執行流程,包括sql的查詢在mysql內部會怎麼流轉,sql語句的更新是怎麼完成的。在分析之前我們一起看看mysql的基礎架構,知道了 mysql由那些元件組成以及這些元件的作用是什麼,可以幫助我們理解和解決這些問題。下面是mysql的乙個簡要架構圖 serve...

使用事務處理多條SQL語句時, error在搗鬼

在很多專案中,都會遇到要處理多條sql語句,當這幾條sql語句是有關聯的情況的時候,要麼都執行,要麼就都不執行,這時候大家都知道,應該使用事務。因此,咱們果斷使用事務,但筆者在執行的時候出現乙個很奇怪的現象,總共有三條insert語句,當我第1條和第3條執行成功,第2條執行失敗的時候,他居然不回滾,...