并發(fā)控制
讀寫鎖
處理并發(fā)讀或寫時氢卡,由兩種類型的鎖組成的鎖系統(tǒng)來解決問題
1.共享鎖既讀鎖秉犹,多個客戶在同一時刻讀取同一個資源,互不干擾
2.排他鎖既寫鎖讼庇,一個寫鎖會堵塞其他的寫鎖和讀鎖,保證只有一個用戶能執(zhí)行寫入近尚,并防止其他用戶讀取正在寫入的同一資源
鎖粒度
表鎖 進行寫操作時巫俺,鎖住整張表,堵塞其他用戶對該表的所有讀寫操作
行級鎖
最大支持并發(fā),Innodb存儲引擎實現(xiàn)了
事務
1.ACID概念
- 原子性:一個事務必須被視為一個不可分割的最小工作單元肿男,整個事務中的所有操作要么全部提交成功介汹,要么全部失敗回滾
- 一致性:數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉換到另外一個一致性的狀態(tài)却嗡。
- 隔離性:一個事務所做的修改再最終提交以前,對其它事務是不可見的嘹承;
- 持久性:一旦事務提交窗价,則其所做的修改就會永久保存到數(shù)據(jù)庫中。
隔離級別 https://www.cnblogs.com/snsdzjlz320/p/5761387.html#_label00
低級別的隔離級一般支持更高的并發(fā)處理叹卷,并擁有更低的系統(tǒng)開銷撼港。
READ UNCOMMITTED(未提交讀):事務中的修改,即使沒有提交骤竹,對其它事務也都是可見的帝牡,也稱臟讀,一般很少使用
READ COMMITTED(提交讀):一個事務從開始直到提交之前蒙揣,所做的任何修改對其它事務都是不可見的靶溜,兩次相同的查詢,查詢結果可能不同懒震,也稱不可重復讀
REPEATABLE READ(可重復讀):在同一個事務中多次讀取同樣記錄的結果是一致的罩息;(MySQL默認事務隔離級別),理論上會出現(xiàn)幻讀(某個事務在讀取范圍內(nèi)的數(shù)據(jù)時个扰,另外一個事務在該范圍內(nèi)插入了新的記錄瓷炮,當之前事務重新讀取時,會出現(xiàn)幻行递宅,innodb已通過機制解決)
SERIALIZABLE(可串行化):最高的隔離級別娘香。通過強制事務串行化執(zhí)行,避免幻讀的問題办龄。SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖茅主,可能導致大量的超市和鎖爭用的問題。只有在非常需要去報數(shù)據(jù)一致性且可以接受沒有并發(fā)的情況下使用土榴。
死鎖
指兩個或多個事務在同一資源上互相占用诀姚,并請求鎖定對方占用的資源,從而導致惡性循環(huán)的現(xiàn)象玷禽。
innodb解決方法:將持有最少行級排他鎖的事務進行回滾赫段。
事務提交
MySQL默認采用自動提交(AUTOCOMMIT)模式。如果不是顯示開始一個事務矢赁,則每個查詢都被當作一個事務執(zhí)行提交操作糯笙。
可以通過設置AUTOCOMMIT變量來啟用或者禁用自動提交模式:
mysql> show variables like 'AUTOCOMMIT';
mysql> set AUTOCOMMIT=1;
*注意:alter table , lock tables 命令在執(zhí)行之前會強制執(zhí)行COMMIT提交當前的活動事務;
隱性和顯性鎖定
隱性鎖定撩银,begin commit或rollback釋放
顯性鎖定:select ... Lock in share mode
select ... For update