存储引擎和数据库锁
一.存儲引擎
1.MySQL體系結構
- 數據庫存儲引擎是數據庫最核心的部分,不同的存儲引擎提供不同的存儲機制、索引技巧等。也就是說不同的存儲引擎底層對數據的組織方式不一樣,從而導致性能和特點也不一樣。
2.MySQL 當中常用的存儲引擎:
3.存儲引擎的操作
-- 1. 創建數據庫 db10 如果不存在則創建 CREATE DATABASE IF NOT EXISTS db10;USE db10;-- 2. 創建數據表的時候,指定存儲引擎 MYISAM CREATE TABLE engine_test (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10) )ENGINE = MYISAM ;-- 3. 查詢存儲引擎 SHOW TABLE STATUS FROM db10;-- 4. 修改數據表當中的存儲引擎 ALTER TABLE engine_test ENGINE = InnoDB;-- 5. 查詢存儲引擎 SHOW TABLE STATUS FROM db10;4.存儲引擎的選擇
MyISAM
特點:不支持事務和外鍵操作。讀取速度快,節約資源。
使用場景:以查詢操作為主,只有很少的更新和刪除操作,并且對事務的完整性、并發性要求不是很高!
InnoDB
特點:MySQL 的默認存儲引擎,支持事務和外鍵操作。
使用場景:對事務的完整性有比較高的要求,在并發條件下要求數據的一致性,讀寫頻繁的操作!
MEMORY
特點:將所有數據保存在內存中,在需要快速定位記錄和其他類似數據環境下,可以提供更快的訪問。
使用場景:通常用于更新不太頻繁的小表,用來快速得到訪問的結果!
總結:針對不同的需求場景,來選擇最適合的存儲引擎即可!如果不確定、則使用數據庫默認的存儲引擎!
二.數據庫鎖
1.鎖的介紹和作用
- 概念:數據庫為了保證數據的一致性,在共享的資源被并發訪問時變得安全所設計的一種規則。
- 作用:鎖機制類似多線程中的同步,作用就是可以保證數據的一致性和安全性
2.鎖的分類
按操作分類
共享鎖:也叫讀鎖。針對同一份數據,多個事務讀取操作可以同時加鎖而不互相影響 ,但是不能修改數據。
排他鎖:也叫寫鎖。當前的操作沒有完成前,會阻斷其他操作的讀取和寫入。
按粒度分類
表級鎖:會鎖定整個表。開銷小,加鎖快。鎖定力度大,發生鎖沖突概率高,并發度低。不會出現死鎖情況。
行級鎖:會鎖定當前行。開銷大,加鎖慢。鎖定粒度小,發生鎖沖突概率低,并發度高。會出現死鎖情況。
按使用方式分類
悲觀鎖:每次查詢數據時都認為別人會修改,很悲觀,所以查詢時加鎖[InnoDB 中的共享鎖、排他鎖、表級鎖、行級鎖都是悲觀鎖]。
樂觀鎖:每次查詢數據時都認為別人不會修改,很樂觀,但是更新時會判斷一下在此期間別人有沒有去更新這個數據。
不同存儲引擎支持的鎖
2.鎖的語法
【注:所有鎖的操作需要要在兩個新連接中操作【如兩臺電腦,獲取一臺電腦連接數據庫兩次】,不是一個連接中的兩個查詢窗口】
<1>InnoDB 共享鎖
共享鎖說明: 數據可以被多個事務查詢(DQL), 但是不能修改(DML)
也稱讀鎖
InnoDB 共享鎖與行鎖和表鎖
-- 使用數據庫 USE db8;-- 開啟事務 START TRANSACTION;-- 查詢id為1數據,并加入共享鎖,給索引列加的默認是行鎖 SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;-- 查詢分數為99的數據,并加入共享鎖,給非索引列加的就是表鎖 SELECT * FROM student WHERE score=99 LOCK IN SHARE MODE;-- 提交事務 COMMIT;結論:
1、多個事務中可以對某行數據同時加共享鎖,因為共享鎖和共享鎖兼容。
2、InnoDB引擎默認加的是行鎖,所以某一行如果被加鎖之后就不能進行修改,但是可以修改其他行數據。
3、InnoDB引擎如果不采用帶索引的列加鎖,加的就是表鎖,那么表中的所有數據都不能被修改。
<2>InnoDB 排他鎖演示
排他鎖說明: 加鎖的數據, 不可以被其他事務加鎖查詢,可以被普通查詢,不支持 增刪改。
也稱寫鎖
結論:
1、如果某個事務中對某行數據加了排他鎖,那么在其他事務中就不能對這行數據加任意鎖查詢,但是可以不加鎖查詢。
2、如果在某個事務某行被加了排他鎖,在其他事務中同樣不能修改該行數據。
<3>MyISAM寫鎖演示
寫鎖說明: 其他連接不能 查詢 和 修改 數據
總結
- 上一篇: 金蝶k312补丁(金蝶k315.0安装教
- 下一篇: JDBC的SQL注入漏洞