show variables like 'autocommit'; 查詢是否開啟自動(dòng)提交
@@autocommit為on或1時(shí)表示開啟自動(dòng)提交。
set autocommit=0;可以顯示的關(guān)閉自動(dòng)提交。
使用MySQL命令 start transaction;可以隱式的關(guān)閉自動(dòng)提交。
commit;命令可以顯示的提交事務(wù)折晦。
savepoint 保存點(diǎn)名;
rollback to savepoint 保存點(diǎn)名;
release savepoint保存點(diǎn)名在抛;可以刪除一個(gè)事務(wù)保存點(diǎn)。
MySQL的鎖:鎖的粒度萧恕,隱式鎖刚梭,顯式鎖,鎖類型廊鸥,鎖的鑰匙望浩,生命周期。
鎖的粒度:服務(wù)器及鎖(server-level)和存儲(chǔ)引擎級(jí)鎖(storage-engine-level locking)
服務(wù)器級(jí)鎖以服務(wù)器為單位惰说,與表的存儲(chǔ)引擎無關(guān)磨德。
flush tables with read lock; 鎖定當(dāng)前MySQL服務(wù)實(shí)例,是服務(wù)器級(jí)讀鎖
MyISAM 只支持表級(jí)鎖
InnoDB 支持表級(jí)和行級(jí)鎖。
數(shù)據(jù)庫自動(dòng)為數(shù)據(jù)加鎖典挑,解鎖酥宴,這種鎖稱為隱式鎖。隱式鎖無需開發(fā)人員維護(hù)您觉。
讀鎖(read lock) 也叫共享鎖
寫鎖(write lock) 排他鎖或獨(dú)占鎖
鎖的鑰匙:
多個(gè)MySQL客戶機(jī)并發(fā)訪問一個(gè)數(shù)據(jù)拙寡,如果客戶機(jī)A對(duì)該數(shù)據(jù)成功加鎖,那么A擁有這把鎖的鑰匙琳水,也只有A能夠?qū)υ撴i進(jìn)行解鎖肆糕。
MyISAM引擎 select操作 會(huì)添加隱式讀說, insert,update,delete會(huì)隱式寫鎖在孝,
即MyISAM引擎都會(huì)隱式的添加表級(jí)鎖诚啃。
alter table account engin=MyISAM;
alter table book engin=MyISAM;
lock tables account read;
select * from accout;
select * from book;
unlock tables;
如果一個(gè)表需要同時(shí)添加讀鎖和寫鎖,那么需要為該表起兩個(gè)別名私沮,以區(qū)分讀鎖和寫鎖始赎。
read local 與read區(qū)別在于 read local是會(huì)話級(jí)別,后者是全局仔燕。
InnDB行級(jí)鎖:
1: 共享鎖 select * from 表 where 條件語句 lock in share mode;
2: 排它鎖 select * from 表 where 條件語句 for update;
insert, update , delete會(huì)隱式的添加排它鎖造垛。
延遲行級(jí)鎖的生命周期,可以通過添加事務(wù)來晰搀。
事務(wù)中的行級(jí)共享鎖和排它鎖的生命周期從加鎖開始五辽,直到事務(wù)提交或者回滾,行級(jí)鎖才會(huì)釋放厕隧。
意向鎖是隱式的表級(jí)鎖奔脐,數(shù)據(jù)庫開發(fā)人員在向InnoDB表的記錄添加行級(jí)鎖時(shí),InnoDB引擎會(huì)先自動(dòng)向該表添加意向鎖吁讨,然后在添加行級(jí)鎖髓迎。
意向鎖: 意向共享鎖(IS) 和 意向排它鎖 (IX)
說明:
意向鎖雖然是表級(jí)鎖,但是卻表示事務(wù)正在查詢或更新某一行記錄建丧,而不是整個(gè)表排龄,因此意向鎖之間不會(huì)產(chǎn)生沖突。
sql執(zhí)行完畢后翎朱,意向鎖會(huì)自動(dòng)解鎖橄维,因此意向共享鎖生命周期非常短暫,且不受為控制拴曲,意向排他鎖也是争舞。
InnoDB 表的行級(jí)鎖是通過對(duì)“索引”施加鎖的方式實(shí)現(xiàn)的,這就意味著澈灼,只有通過索引字段檢索數(shù)據(jù)的查詢語句或者更新語句竞川,才可能施加行級(jí)鎖店溢,否則InnoDB將使用表級(jí)鎖,而使用表級(jí)鎖勢(shì)必降低表的并發(fā)性能委乌。
show variables like 'innodb_lock_wait_timeout';
show full processlist; 查看當(dāng)MySQL實(shí)例運(yùn)行的線程信息
kill 線程id;
對(duì)于數(shù)據(jù)庫開發(fā)人員而言床牧,如果不了解InnoDB行級(jí)鎖是基于索引實(shí)現(xiàn)這一特性,可能會(huì)導(dǎo)致大量的鎖沖突遭贸,從而影響并發(fā)性能戈咳。
間隙鎖(next-key),間隙鎖也與索引密切相關(guān)。間隙鎖會(huì)鎖住沒加鎖的相鄰的數(shù)據(jù)
記錄鎖壕吹,僅僅為滿足查詢范圍記錄的施加鎖
Mysql的事務(wù)隔離級(jí)別為 repeatable read是 默認(rèn)使用時(shí)間隙鎖
隔離級(jí)別是 uncommitted或read committed 默認(rèn)是記錄鎖
默認(rèn)下著蛙,InnoDB存儲(chǔ)引擎一旦出現(xiàn)鎖等待超時(shí)異常,InnoDB存儲(chǔ)引擎既不會(huì)提交事務(wù)算利,也不會(huì)回滾事務(wù)册踩,而這是十分危險(xiǎn)的泳姐,一旦發(fā)生鎖等待超時(shí)效拭,應(yīng)用程序應(yīng)該自定義錯(cuò)誤處理程序,由開發(fā)人員選擇是進(jìn)一步提交事務(wù)還回滾事務(wù)胖秒。
默認(rèn)情況下InnoDB存儲(chǔ)引擎會(huì)自動(dòng)檢測(cè)死鎖缎患,通過比較參與死鎖問題的事務(wù)權(quán)重,從而選擇權(quán)重較小的事務(wù)進(jìn)行回滾阎肝,并釋放鎖挤渔,以便其他事物獲得鎖,繼續(xù)完成事務(wù)风题。每個(gè)事務(wù)的權(quán)重存儲(chǔ)在information_schema 數(shù)據(jù)庫INNODB_TRX表的trx_weight字段中判导。
事務(wù)的ACID特性
原子性
一致性
隔離性
持久性
事務(wù)的隔離級(jí)別:
Read uncommitted 讀 未提交數(shù)據(jù)
Read committed 讀已提交數(shù)據(jù)
Repeatable read 可重復(fù)讀
Serializable 串行化
臟讀:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)未提交數(shù)據(jù)。
不可重復(fù)讀:同一個(gè)事務(wù)內(nèi)沛硅,兩條相同的查詢語句的查詢結(jié)果不一致眼刃。
幻讀:同一個(gè)事務(wù)內(nèi),兩條相同查詢語句的查詢結(jié)果本應(yīng)該相同摇肌。但是擂红,如果另一個(gè)事務(wù)同時(shí)提交了新數(shù)據(jù),當(dāng)本事務(wù)更新時(shí)围小,會(huì)“驚奇的”發(fā)現(xiàn)這些新數(shù)據(jù)昵骤,貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺。
select @@session.tx_isolattion; 查詢MySQL服務(wù)實(shí)例的隔離級(jí)別
select @@global.tx_isolation; 查全局
設(shè)置隔離級(jí)別
set { global | session} transaction isolation level {
read uncommitted | read committed | repeatable read | serializable
}
說明:不可重復(fù)讀與臟讀的區(qū)別在于肯适,臟讀現(xiàn)象是讀取了其他事務(wù)未提交的數(shù)據(jù)变秦;而不可以重復(fù)讀現(xiàn)象讀到的是其他事務(wù)已提交的數(shù)據(jù)。
說明:幻讀現(xiàn)象與不可重復(fù)讀現(xiàn)象的不同之處在于框舔,幻讀現(xiàn)象讀不到其他事物已經(jīng)提交的數(shù)據(jù)蹦玫,而不可重復(fù)讀現(xiàn)象讀到的是其他事物已經(jīng)提交的數(shù)據(jù)。
避免幻讀的兩個(gè)方法:
1:保持事務(wù)的隔離級(jí)別是repeatable read不變,利用間隙鎖的特點(diǎn)钳垮,對(duì)查詢結(jié)果集施加共享鎖(lock in share mode) 或排它鎖 (for update )惑淳。這種方法要求數(shù)據(jù)庫開發(fā)人了解間隙鎖的特點(diǎn)
2:將事務(wù)的隔離級(jí)別設(shè)置為serializable,可以避免幻讀現(xiàn)象。