MySQL中的鎖之一:鎖的必要性及分類

當用戶訪問量增加時,數據庫每每是一個系統的性能瓶頸,但不光光是性能瓶頸,數據安全也會隨之浮現,這時候鎖機制就很是有必要。

併發形成的數據安全問題主要分爲3個方面:髒讀、幻讀、不可重複讀

一. 髒讀數據庫

髒讀就是一個事務讀取到了另外一個事務未提交的數據。
時間線  事務1                               事務2
  1    begin;                                  
  2    select * from lock where id = 1;
  3                                       begin;
  4                                       update lock set name='dirty';
  6    select * from lock where id = 1;
  7    commit;                            commit;

二. 幻讀安全

幻讀就是一個事務讀到了另外一個事務insert的數據
時間線       事務1                            事務2
   1        begin;
   2        select * from lock where id > 1;
   3                                        begin;
   4                                        insert lock select 2;
   5                                        commit;
   6        select * from lock where id > 1;
   7        commit;

三. 不可重複讀併發

不可重複讀就是屢次讀取統一數據返回的結果不一致。同髒讀不一樣,這是讀取已經提交的數據;同幻讀也不一樣,這邊是更新數據,幻讀是插入數據。
時間線   事務1                            事務2
        begin;
        select * from lock where id = 1;
                                        begin;
                                        update lock set name='non-rr';
                                        commit;
        select * from lock where id = 1;
        commit;

MySQL經過對事務的隔離來解決以上三種問題
共有4種隔離級別性能

隔離級別           髒讀   幻讀   不可重複讀
未提交讀(RUC)       是     是      是
已提交讀(RC)        否     是      是
可重複讀(RR)        否     是      否
可串行化            否     否      否

MySQL經過鎖機制來實現事務的隔離
鎖的分類以下
圖片描述spa

相關文章
相關標籤/搜索