鎖
一、表鎖mysql中最基本的鎖策略,是開銷最小的策略。
二、表鎖鎖定整張表。使用者在對錶進行寫操作前,需要先獲取寫鎖,阻塞其他使用者對該錶的所有讀寫操作。
三、表鎖在沒有寫鎖時,使用者才會獲取讀鎖,讀鎖與寫鎖之間是不相互阻塞的
四、表鎖在特定場景中,表鎖的效能比較良好。
五、表鎖寫鎖優先順序要高於讀鎖,,寫鎖可能會插入到讀鎖之前,讀鎖不能插入到寫鎖之前
六、alert、table之類的語句使用表鎖會忽略儲存引擎的鎖機制
七、行級鎖可以最大程度的支援併發處理,但是開銷要比表鎖大。
八、行級鎖只在儲存引擎層實現。
事務一、事務內的語句要麼全部執行成功,要麼全部執行失敗,不會出現有的執行成功,有的沒有執行失敗。
二、原子性是指乙個事務必須被視為乙個不可分割的最小工作單位。
三、一致性是指資料庫總是從乙個一致性的狀態轉換到另外乙個一致性的狀態。
四、隔離性是指乙個事務所做的修改在最終提交之前,對其他事務是不可見的(一般情況下,隔離級別不一樣,效果不太一樣的)。
五、永續性是指一旦事務提交,所做的修改就會永久儲存到資料庫中
六、使用事務和使用鎖一樣會增加系統的開銷
七、使用start transaction; sql 語句塊; commit; rollback;
commit在成功是進行提交,rollback是在有失敗的情況下進行回滾。
隔離級別
一、主要是針對事務的
二、未提交讀(read uncommitted):事務中的修改,即使沒有進行提交,對其他事務也是可讀的,事務可以讀取未提交的資料(髒讀),很少使用該隔離級別除非有非常必要的理由的情況下不要使用該隔離級別。
三、提交讀(read committed):只有當事務提交後其他事務才是可以可見的。
四、可重複讀(repeatable read):可以解決髒讀的問題,保證了同乙個事務中多次讀取同樣記錄的結果是是一致的。該隔離級別會產生幻讀,幻讀並不是兩次讀到的不一樣是幻讀,而是對這個事務後期的業務邏輯有影響的才是幻讀。對於下面邊的例子中,對於事務a來說,查詢為空,按理是可以插入的, 但是a提交之前b插入了id=1,導致a不能insert,這就是幻讀a begin select id from test //此時結果為空 insert into test(id) value (1) commit //此時會報錯,主鍵重複 b begin insert into test (id) value (1); commit;
會報**duplicate entry 『3』 for key 『primary 主鍵重複』**該隔離級別為mysql預設的。但是innodb和xtradb可以通過版本併發控制解決幻讀的問題。
五、可序列話(serializable):是最高的隔離級別。可以避免可重複讀的幻讀現象,會在讀取的每一行資料上加鎖。該隔離級別會造成超時和鎖爭用的現象。一般情況下不會使用該隔離級別。
死鎖多個事務試圖以不同的順訊所內固定資源時或多個事務同時鎖定同乙個資源時會產生死鎖。產生死鎖的原因是真正資料的衝突(通常很難避免),有一些則是由於儲存引擎的實現方式引起的。一般資料庫都實現了各種死鎖檢測和死鎖的超時機制。大多數情況下需要重新執行因死鎖回滾的事務即可。
引用於電子工業出版社出版的《高效能mysql》一書
mysql運維 讀書筆記 Mysql 讀書筆記
mysql儲存時間有兩種型別 datetime和timestamp。分別說一下兩者的區別。datetime,以8位元組儲存時間,理論上可以從0000年儲存到9999年。並且沒有時區的概念,它儲存的就是乙個時間點的概念。timestamp和datetime最主要的不同就是,它是以4個位元組儲存,由19...
讀書筆記 Mysql 索引
mysql有不同的儲存引擎型別,儲存引擎使用不同的方式將索引存放在磁碟上。不同的存放方式對效能有不同的影響。myisam按照行儲存的物理位置來尋找資料,innodb按照主鍵值引用行。mysql 索引的型別 b tree索引 b tree索引的適用場景 匹配全名,匹配最左字首,匹配列字首,精確匹配一部...
MySQL讀書筆記 初識
大家都說資料庫,mysql裡面所謂的資料庫指的是哪個部分呢。資料最後是存放到磁碟上的,儲存之後的檔案,是資料庫。服務例項 我們mysql uroot p進行連線,並沒有直接連線到儲存資料的檔案上面。真正操控檔案的,是一組服務,我們只是呼叫了這個操作服務。一般來說,乙個服務例項操縱一組儲存檔案,但是集...