并發(fā)控制
讀寫鎖
處理并發(fā)讀或?qū)憰r,由兩種類型的鎖組成的鎖系統(tǒng)來解決問題
1.共享鎖既讀鎖,多個客戶在同一時刻讀取同一個資源,互不干擾
2.排他鎖既寫鎖,一個寫鎖會堵塞其他的寫鎖和讀鎖,保證只有一個用戶能執(zhí)行寫入,并防止其他用戶讀取正在寫入的同一資源
鎖粒度
表鎖 進(jìn)行寫操作時,鎖住整張表,堵塞其他用戶對該表的所有讀寫操作
行級鎖
最大支持并發(fā),Innodb存儲引擎實現(xiàn)了
事務(wù)
1.ACID概念
- 原子性:一個事務(wù)必須被視為一個不可分割的最小工作單元,整個事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾
- 一致性:數(shù)據(jù)庫總是從一個一致性的狀態(tài)轉(zhuǎn)換到另外一個一致性的狀態(tài)。
- 隔離性:一個事務(wù)所做的修改再最終提交以前,對其它事務(wù)是不可見的;
- 持久性:一旦事務(wù)提交,則其所做的修改就會永久保存到數(shù)據(jù)庫中。
隔離級別 https://www.cnblogs.com/snsdzjlz320/p/5761387.html#_label00
低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。
READ UNCOMMITTED(未提交讀):事務(wù)中的修改,即使沒有提交,對其它事務(wù)也都是可見的,也稱臟讀,一般很少使用
READ COMMITTED(提交讀):一個事務(wù)從開始直到提交之前,所做的任何修改對其它事務(wù)都是不可見的,兩次相同的查詢,查詢結(jié)果可能不同,也稱不可重復(fù)讀
REPEATABLE READ(可重復(fù)讀):在同一個事務(wù)中多次讀取同樣記錄的結(jié)果是一致的;(MySQL默認(rèn)事務(wù)隔離級別),理論上會出現(xiàn)幻讀(某個事務(wù)在讀取范圍內(nèi)的數(shù)據(jù)時,另外一個事務(wù)在該范圍內(nèi)插入了新的記錄,當(dāng)之前事務(wù)重新讀取時,會出現(xiàn)幻行,innodb已通過機(jī)制解決)
SERIALIZABLE(可串行化):最高的隔離級別。通過強制事務(wù)串行化執(zhí)行,避免幻讀的問題。SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖,可能導(dǎo)致大量的超市和鎖爭用的問題。只有在非常需要去報數(shù)據(jù)一致性且可以接受沒有并發(fā)的情況下使用。
死鎖
指兩個或多個事務(wù)在同一資源上互相占用,并請求鎖定對方占用的資源,從而導(dǎo)致惡性循環(huán)的現(xiàn)象。
innodb解決方法:將持有最少行級排他鎖的事務(wù)進(jìn)行回滾。

事務(wù)提交
MySQL默認(rèn)采用自動提交(AUTOCOMMIT)模式。如果不是顯示開始一個事務(wù),則每個查詢都被當(dāng)作一個事務(wù)執(zhí)行提交操作。
可以通過設(shè)置AUTOCOMMIT變量來啟用或者禁用自動提交模式:
mysql> show variables like 'AUTOCOMMIT';
mysql> set AUTOCOMMIT=1;
*注意:alter table , lock tables 命令在執(zhí)行之前會強制執(zhí)行COMMIT提交當(dāng)前的活動事務(wù);
隱性和顯性鎖定
隱性鎖定,begin commit或rollback釋放
顯性鎖定:select ... Lock in share mode
select ... For update