myisam和innodb關於鎖方面的區別是什麼
myisam預設使用的是表級鎖,不支援行級鎖.
innodb預設使用的是行級鎖,也支援表級鎖.
下面的東西針對於myisam引擎:
什麼是表級鎖
舉例:前提:我當前有一張表student,使用的是myisam引擎.
我們在這裡模擬乙個併發操作哈:
當我們對錶進行查詢操作的時候,倘若我們在查詢操作還沒有結束,還在執行的過程中去執行乙個修改操作,我們會發現只有當我們的查詢操作結束後,才會執行我們修改操作的指令.
這是因為我們在執行查詢語句的時候,myisam自動地給我們的student表上了乙個表鎖
,也就是說,它會鎖住這張表,不允許此時其他對錶的更新操作(增刪改)
其實是這樣子的:
當我們對資料庫表使用查詢語句select的時候,它會為該資料庫表加上乙個表級的讀鎖
當我們對資料庫表進行增刪改的時候,它會自動為該資料庫表加上乙個表級的寫鎖
當我們的查詢操作還沒有執行結束,即讀鎖還沒有被釋放的時候
,我們去執行增刪改操作,這時myisam會給資料庫表新增寫鎖
,但是讀鎖還沒有釋放,所以新增寫鎖的操作就會被阻塞
,直到所有的讀鎖都被釋放為止.
如何顯式地給資料庫表新增表級鎖
新增讀鎖: lock tables 表名 read;
新增寫鎖: lock tables 表名 write;
釋放鎖: unlock tables;
讀鎖也叫作共享鎖: 即我併發的同時執行兩個讀取操作(執行查詢語句會自動新增寫鎖),兩個讀操作不會有影響(也就是說支援同時上兩個共享鎖)
,不會像更新操作那樣要等乙個執行結束才執行另乙個.
寫鎖也叫作排它鎖: 即我併發的同時執行兩個更新操作(更新操作會自動新增寫鎖),要等先執行的那乙個執行結束,釋放了寫鎖後,執行另一條更新語句才會被執行,此時資料庫表再次被加上乙個寫鎖.
myisam引擎注意事項:
乙個資料庫表同一時間只能上乙個鎖.
它只支援表級鎖,不支援行級鎖,也就是說,它會鎖住整張表.
它不支援事務管理,所有對資料庫的操作都會直接影響資料庫的資料.
支援同時上多個共享鎖
,即可以多次讀取,互相不影響,但是如果先上的是排它鎖
,那麼其他的任何操作都是不允許的,必須等排它鎖被釋放才可以.
我們也可以為查詢語句加上排它鎖
:
例如:當執行了select * from user where id between 1 and 200000 for update
語句後,user表
就被新增了排它鎖,此時,我們在該查詢語句沒有結束前再併發地執行另一條查詢語句的話,那麼另一條查詢語句就只能等之前的查詢語句執行結束後釋放了排它鎖之後才能執行.
下面的東西針對於innodb引擎:
上面的共享鎖和排它鎖在innodb中也有,效果也一樣(比如加了共享鎖不能加排它鎖啊,可以同時加共享鎖啊這些都一樣),不過還是有些許差別(比如select語句不自動加共享鎖等).
innodb支援事務管理,mysql預設自動提交事務,而且只有當前事務commit了之後,鎖才會被釋放.
例子:
我們同時對乙個表進行兩次更新操作,我們會發現,兩次更新操作是互不影響的,這如果在myisam引擎中是不應該發生的.
這種情況主要是因為,innodb使用的是二段鎖
.
什麼是二段鎖
二段鎖也就是說: 加鎖和解鎖是分成兩個步驟來進行的,即先對同乙個事務裡的一批操作分別加鎖,然後在提交commit的時候,再對事務裡加上的鎖進行統一的解鎖.由於mysql預設自動提交,所以看起來和myisam沒啥區別.
幾條mysql命令
檢視自動提交的狀態:
show variables like 『autocommit』
關閉自動提交:
set autocommit = 0;
開啟自動提交:
set autocommit = 1;
手動新增排它鎖:
select * from person where id = 3 for update;
手動新增共享鎖同時驗證行級鎖:
select * from person where id = 3 lock in share mode;
執行上面的語句之後,就表示給id=3的那一行新增了共享鎖
,此時我們對id=3的那一行進行更新操作會被阻塞,只有當我們對當前事務進行了提交(共享鎖被釋放)之後,更新操作才會進行.但是,如果我們是併發的對id=4(只要不等於3就行)進行增刪查改操作的話,絲毫不會受到影響,這就說明innodb預設支援行級鎖
innodb中對select語句進行了特殊處理
例子如下:
我們將資料庫設定為不自動提交後
如果我們對資料庫中某行進行查詢操作,它不會自動新增共享鎖
然後我們併發的對該行進行更新操作,我們發現更新操作不受查詢操作的影響,amazing!
這就是因為innodb中對select語句進行了改進,使得select沒有對該行上鎖,所以才導致更新是成功的,這個我之後再寫
小知識當用到表級鎖的時候,只要操作了表裡的資料,表都會被鎖住,所以表級鎖與索引無關.
當查詢語句用到了索引的時候,用的時行級鎖,即只對操作的這一行加鎖,對其他行的操作不會有影響.
當查詢語句不走索引的時候,用的是表級鎖.
myisam使用的是非聚簇索引(索引儲存資料檔案的指標和資料分開放,主鍵索引和輔助索引都可以直接拿到資料,在純檢索,即增刪改很少的系統中效能比innodb要好
),innodb有且僅有乙個聚簇索引(資料檔案和索引放在一起的,必須要有主鍵,通過主鍵索引效率很高,但是當用到輔助索引的時候需要查兩次,)不論是表級鎖還是行級鎖,都分為共享鎖和排它鎖.
共享鎖簡寫是s
,排它鎖簡寫是x
,這都是針對於行的行級鎖.
意向共享鎖is
,意向排他鎖ix
,這是innodb針對於表的表級鎖.
是不是行級鎖一定比表級鎖要好?
不是的
因為鎖的範圍越小,代價越高,相比於表級鎖在表的頭部直接加鎖來講,行級鎖還要掃瞄到某行然後對其上鎖,代價比表級鎖大多了
同時innodb支援事務,相比於myisam也帶來了更大的開銷.
資料庫考點 1
關係型資料庫和非關係型資料庫的區別 簡單來說 1.關係型資料庫通過外來鍵關聯來建立表與表之間的關係 2.非關係型資料庫通常指資料以物件的形式儲存在資料庫中,而物件之間的關係通過每個物件自身的屬性來決定 比如 有乙個學生的資料 姓名 張三,性別 男,學號 12345,班級 二年級一班 還有乙個班級的資...
資料庫考點 4
如何定位並優化慢查詢sql 慢查詢語句只會是dml,資料操作語言 這個問題屬於開放性的題目,具體場景需要具體分析,這裡給個大致思路 根據慢日誌定位慢查詢sql.使用explain等工具分析sql.修改sql或者盡量讓sql走索引.1.根據慢日誌定位慢查詢sql 慢日誌的作用就是用來記錄執行速度比較慢...
資料庫考點 10
next key鎖 行鎖 gap鎖 行鎖 行鎖 即record lock,指對單個行記錄上的鎖.gap鎖 gap lock 間隙鎖 表示鎖定乙個範圍,但不包括記錄本身.其主要目的是為了防止同一事務的兩次當前讀出現幻讀的情況.它在rc及ru隔離級別中是沒有的,在rr以及序列化中預設支援,這就是為啥rc...