1. 程式人生 > >34、mysql鎖、事務、隔離

34、mysql鎖、事務、隔離

連線池   與使用者請求建立連線

核心功能層         查詢解析,分析,優化,內建函式,跨儲存引擎的功能

儲存引擎層         資料的存入和提取


mysql的傳送預設為明文,可以使用ssl加密資料


parser 詞法,語法,語意分析,優化

explain 分析工具

query cache 快取,只儲存select查詢

併發訪問控制:基於鎖來實現


MySQL鎖:

執行操作時施加的鎖的模式

  讀鎖:使用者在讀的時候施加的鎖,為防止別人修改,但是使用者可以讀,還被稱為共享鎖

  寫鎖:獨佔鎖,排它鎖。其他使用者不能讀,不能寫


鎖粒度:

  表鎖:table lock

     鎖定了整張表

  行鎖:row lock

     鎖定了需要的行


   粒度越小,開銷越大,但併發性越好:

   粒度越大,開銷越小,但並非性越差;


 鎖的實現位置:

    MySQL鎖 可以手動使用,可以使用顯示鎖

    儲存引擎鎖 自動進行的(隱式鎖)


    顯示鎖:

        LOCK TABLES t1 READ; 施加讀鎖

        LOCK TABLES t1 WRITE; 施加寫鎖

        UNLOCK TABLES; 解鎖

        SHOW OPEN TABLES WHERE In_use > 0; 檢視那些表被鎖定


    InnoDB儲存引擎也支援另外一種顯示鎖(鎖定挑選出的部分行,行級鎖)

      select .... lock in share mode

      select .... for update

SHOW TABLE STATUS LIKE 't1'\G

SELECT * FROM t1 WHERE ID <=3 LOCK IN SHARE MODE;

做備份時要手動施加讀鎖


事務:Transaction

    事務就是一組原子性的查詢語句,也即將多個查詢當作一個獨立的工作單元


    ACID測試:能夠滿足ACID測試就表示其支援事務,或相容事務

    A:Atomicity 原子性,都執行或者都不執行

    C:Consistency          一致性,從一個一致性狀態轉到另外一個一致性狀態

    I:Isolaction 隔離性。一個事務的所有修改操作在提交前對其他事務時不可見的

    D: Durability 永續性,一旦事務得到提交,其所做的修改會永久有效

安全性越高,併發性越低

 

隔離級別:

   READ UNCOMMITTEND (讀未提交),髒讀,不可重複讀,幻讀

   READ COMMITTEND (讀提交)

   REPEATABLE READ             (可重讀)

   SERIALIZABLE (可序列化)強制事務的序列執行避免了幻讀;效能極低


START TRANSACTION; 啟動事務( MyISAM不支援事務)

COMMIT; 事務提交

ROLLBACK 事務回滾(全部回滾)

SAVEPOINT identifier         建立回滾點

ROLLBACK TO identifier                 事務回滾(回滾到某個點)



mysql事務預設自動提交,對手動顯示啟動事務不會影響。

如何沒有顯式啟動事務,每個語句都會當作一個預設的事務,其執行完成會被自動提交

可通過如下方式關閉自動提交。

SHOW GLOBAL VARIABLES LIKE '%commit%';

select @@global.autocommit

set global autocommit = 0

注意 關閉自動提交,請記得手動啟動事務,應記得手動提交


檢視mysql的事務隔離級別

   show global  variables like '%iso%'

   select @@global.tx_isolation


建議:對事物要求不特別嚴格的場景下,可以使用讀提交


MVCC:多版本併發控制

    每個事務啟動時,InnoDB會為每個啟動的事務提供一個當下時刻的快照

      為實現此功能,InnoDB會為每個表提供兩隱藏的欄位,一個用於儲存行的建立時間,一個用於儲存行的失效時間

        裡面儲存的系統版本號


MVCC只在兩個隔離級別下有效:read committed和repeatable read