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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章