在總結資料庫鎖之前先闡述一下 資料庫的集中隔離級別以及它們分別能避免哪些問題:
1.未提交讀,最低階的隔離級別,不能避免丟失更新以及髒讀。
2.提交讀,可以避免丟失更新以及髒讀。
3.可重複讀,可以避免不可重複讀。
4.可序列化,可以避免幻影讀。
mysql預設級別是3,
mysql的兩大主要引擎,1是innodb引擎,它支援表鎖,行鎖,支援事務,底層用的是聚簇索引,2。是myisam引擎,它僅僅支援表鎖,不支援事務。
innodb所有的鎖是下面這些鎖,其中樂觀鎖就是認為所有的事務都不會發生衝突,悲觀鎖就是所有的事務都可能發生衝突,所以樂觀鎖只在更新資料的時候檢視版本號和時間戳,沒有就提交事務,而悲觀鎖則是在進行更新,讀寫是之前就會自動進行加鎖,再根據鎖的相容性有共享和排他鎖 分別在mysql語句後面加上lock in share mode和for update,也可以提前宣告:
關於鎖的粒度則是表鎖,行鎖,頁鎖,表鎖是對整個表枷鎖,開銷低,發生的衝突大,行鎖則是相反,行鎖在innodb中都是基於索引實現的,它鎖定的也只是索引或者索引的區間而已。
關於快照讀和當前讀:
當前讀就是加鎖讀,會讀取最新記錄的最新版本,保證讀取器件其他的併發事務不會對當前讀有所影響,一直到獲取鎖的事務釋放為止。
快照讀就是不加鎖讀,讀取記錄的快照版本而非最新版本,通過mvcc實現,保證事務中只有自己第一次讀提交前的修改和自己的修改可見,其他都不可見。
關於mvcc ,在高效能mysql一書中的說明:
總結下來就是mvcc為
1.select選擇版本號時只選擇小於等於當前事務版本的資料行,可以確保事務讀取的記錄要麼時事務開始之前已經存在,要麼就是自己修改或者插入。
對於刪除,要麼未定義,要麼大於當前版本號,可以確保事務即將讀而未開始讀的行不會在事務開始之前被事務刪除。
2.insert 每一行儲存當前系統版本號作為行版本號。
3.delete 為每一行儲存當前版本號作為行刪除標識。
4.update 儲存當前版本號作為行版本號,同時儲存當前版本號到原來的行作為行刪除標識。
mvcc的好處就是不需要加鎖,但是會有額外的開銷,另外mvcc只與rr和rc相容和 serializable 和ru不相容,因為ru總是會讀取最新的資料行,這與mvcc 的原理時矛盾的,serializable是會不停的加鎖。
下面是 innodb的 三種鎖:record lock、gap lock和next-key lock
我會用詳細的例子來解釋這三種鎖,
下面是不同的索引使用的區別:
1.等值查詢使用聚簇索引
record lock會對相關主鍵索引加鎖。
2.等值查詢使用唯一索引
會對輔助索引和主鍵索引加鎖。
3.等值查詢使用輔助索引:
會對輔助索引加乙個gap鎖,然後對主鍵索引加乙個record 鎖。
,先寫這麼多把,出去抽根菸再說。
關於Oracle鎖的一些總結
煙一支一支地點 酒一杯一杯的幹 請你要體諒我 我酒量不好別給我挖坑 不時會遇到,不小心把錶鎖住的情況。再此,相對oracle鎖相關的知識做一些粗淺的總結。當不小心鎖表時 1 查詢session被鎖的sql,簡要查詢,得到sid select object name,machine,s.sid,s.s...
資料庫樂觀鎖和悲觀鎖的一些理解
資料庫為了實現併發控制通常會採用加鎖的方法。而鎖通常分為兩類 樂觀鎖和悲觀鎖。在某篇文章中看到這是從使用者的角度來看的。如果從資料庫實現來看,則好像是分成共享鎖 s鎖 和獨佔鎖 x 在這裡只談一下我對樂觀鎖和悲觀鎖的一些個人理解。樂觀鎖的出發點是相信併發操作發生衝突的概率比較少,即兩個使用者同時對一...
關於資料庫中的一些知識
1,什麼是觸發器 trigger 觸發器是一種特殊型別的儲存過程,當使用下面的一種或多種資料修改操作在指定表中對資料進行修改時,觸發器會生效 update insert 或 delete。觸發器可以查詢其它表,而且可以包含複雜的 sql 語句。它們主要用於強制複雜的業務規則或要求。例如,可以控制是否...