事務
事務是一組原子性sql查詢語句,被當作乙個工作單元。若mysql對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對資料生效,若sql中任意不能執行或出錯則事務操作失敗,所有對資料的操作則無效(通過回滾恢復資料)。
事務有四個屬性原子性:事務被認為不可分的乙個工作單元,要麼全部正常執行,要麼全部不執行。
一致性:事務操作對資料庫總是從一種一致性的狀態轉換成另外一種一致性狀態。
隔離性:乙個事務的操作結果在內部一致,可見,而對除自己以外的事務是不可見的。
永久性:事務在未提交前資料一般情況下可以回滾恢復資料,一旦提交(commit)資料的改變則變成永久(當然用update肯定還能修改)。
多事務執行時的併發問題第一類丟失更新:撤銷乙個事務時,把其他事務已提交的更新資料覆蓋;
髒讀:乙個事務讀到另乙個事務未提交的更新資料;
虛讀:乙個事務讀到另乙個事務已提交的新插入的資料;
不可重複讀:乙個事務讀到另乙個事務已提交的更新資料;
第二類丟失更新:這是不可重複讀中的特例,乙個事務覆蓋另乙個事務已提交的更新資料。
資料庫鎖
共享鎖用於讀資料操作,他是非獨佔的,允許其他事務同時讀取其鎖定的資源,但不允許其他事務更新他。加鎖條件:當乙個事務執行select語句時。
解鎖條件:預設情況下,資料讀取後,資料庫系統立即釋放共享鎖。
相容性:放置共享鎖後還可放置共享鎖和更新鎖。
併發性:具有良好的併發效能。當多個事務讀取相同的資料時,每個事務都會獲得一把共享鎖,因此可以同時讀鎖定的資料。
獨佔鎖也叫排他鎖,使用與修改資料的場合。他鎖定的資源,其他事務不能進行讀寫。加鎖條件:當乙個事務執行insert,update,delete時,資料庫系統會自動對被操作的資料使用獨佔鎖。如果該資料已有其他鎖存在,則不能放置獨佔鎖。
解鎖條件:事務結束。
相容性:不和其他鎖相容。
併發性:併發性差,只允許有乙個事務訪問鎖定資料。其他事務需等待,直到當前事務結束。
更新鎖更新操作的初始階段用來鎖定可以能要被修改資源的鎖。更新鎖可避免使用共享鎖造成的死鎖現象。加鎖條件:當執行update時,資料庫系統會先為事務分配乙個更新鎖。
解鎖條件:當讀取資料完畢,執行更新操作時,更新鎖公升級為獨佔鎖。
相容性:與共享鎖相容。乙個資源可同時放置更新鎖和共享鎖,但只能放置一把更新鎖。
併發性:允許多個事務同時讀鎖定的資源,但不允許其他事務修改。
讀鎖也叫共享鎖、s鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s 鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。
寫鎖又稱排他鎖、x鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其他事務不能再對a加任何鎖,直到t釋放a上的鎖。這保證了其他事務在t釋放a上的鎖之前不能再讀取和修改a。
表鎖操作物件是資料表。mysql大多數鎖策略都支援(常見mysql innodb),是系統開銷最低但併發性最低的乙個鎖策略。事務t對整個表加讀鎖,則其他事務可讀不可寫,若加寫鎖,則其他事務增刪改都不行。
行級鎖操作物件是資料表中的一行。是mvcc技術用的比較多的,但在myisam用不了,行級鎖用mysql的儲存引擎實現而不是mysql伺服器。但行級鎖對系統開銷較大,處理高併發較好。
mvcc
多版本併發控制(mvcc,multiversion currency control)。一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理資料,而是結合了mvcc機制,以處理更多的併發問題。mvcc處理高併發能力最強,但系統開銷比最大(較表鎖、行級鎖),這是最求高併發付出的代價。
如何防止死鎖合理安排表訪問順序;
使用短事務(包含盡可能少的能在短時間內完成操作的事務);將事務分解為多個小事務,讓後分別執行。這樣可保證每個小事務的快速完成,減少對資料資源鎖定的時間;減少執行事務過程中等待需要更新的資料。
如果對資料要求不高,可以允許髒讀。髒讀不需要對資料資源加鎖,可以避免鎖衝突;
如果可能,錯開多個事務訪問相同資料資源的時間,防止鎖衝突;
使用盡可能低的事務隔離級別。
資料庫事務隔離級別serializalble: 序列化。乙個事務在執行過程完全看不到其他事務對資料庫所做的更新。當兩個事務同時訪問相同資料時,第乙個事務必須等第二個事務完成後才能訪問。
repeatable read: 可重複讀。事務在執行過程中可以看到其他事務已提交的新插入記錄,但不能看到其他事務已提交的對已有記錄的更新。
read committed: 讀已提交資料。事務在執行過程中可以看到其他事務已提交的新插入記錄,也可看到其他事務已提交的對已有記錄的更新。
read uncommited: 讀未提交資料。事務在執行過程既可以看到其他事務沒有提交的新插入資料,也可看到其他事務已經提交的對已有記錄的更新。
其中serializalble的隔離級別最高,但併發效能最差。而read uncommited的隔離級別最低,但併發效能最好。隔離級別越高,越能保證資料的完整性和一致性,但併發效能則會降低。對於多數程式,可以優先考慮把資料庫系統的隔離級別設定為read committed,它可以避免髒讀,而且具有較好的併發效能。
mysql 事務及其MVCC原理
mysql事務分為四類 4種隔離級別 1.未提交讀 read uncommitted ru ru sessiona a讀取b中update中未commit中的資料,讀到的 若此時b進行了rollback回滾操作。a中讀取到的值依然是b 修改後的這個值,這就是所謂的髒讀 sessionb update...
mvcc原理 MVCC 原理
mvcc 原理 簡單說,讀了一條未提交的資料 乙個事務讀取了另外乙個事務修改後記錄 強調的是 update 和delete 只需要鎖住滿足條件的記錄即可 乙個事務讀取了另外乙個事務插入的資料,強調的是 insert 要鎖住滿足條件及相近的記錄。mysql 中預設的隔離級別是可重複讀,可解決髒讀和不可...
MySQL(十四) 事務 MVCC機制
事務的四大特性 atomicity 原子性 isolation 隔離性 consistency 一致性 和durability 永續性 重點說下隔離性,指的是多個事務並行執行時,效果上就像乙個乙個執行的。沒有因為是並行而導致問題。因為系統不可能完全讓事務順序執行,這樣效能太差,所以說需要在併發的同時...