事務的四大特性:atomicity(原子性),isolation(隔離性),consistency(一致性)和durability(永續性)。
重點說下隔離性,指的是多個事務並行執行時,效果上就像乙個乙個執行的。沒有因為是並行而導致問題。因為系統不可能完全讓事務順序執行,這樣效能太差,所以說需要在併發的同時滿足隔離性。
接下來,再看下事務併發執行時會遇到怎樣的問題?
髒寫,或者說寫覆蓋。就是是a更新一行資料,還未提交,事務b又更新了同一行資料。一句話概括即使,允許事務更新未提交的事務已經更新的行。這個會導致嚴重的問題,比如事務b之後又回滾了,那麼a的修改也會被覆蓋。
髒讀;不可重複讀;
幻讀;再重點看下幻讀,幻讀有兩個特點:一是必須是別的事務插入導致的;而是必須是第二次讀讀到的行變多了;
隔離級別
sql標準有四種隔離級別:
當然這個也僅是標準,不同的實現會略有不同,比如mysql就可以在rr級別下避免幻讀問題。另外再強調下事務與鎖的關係。為了保證事務併發讀,在非序列化隔離級別下,事務的普通讀取都不需要加鎖,非鎖定讀。
下面看下mysql裡如何解決髒讀和不可重複讀問題的。
使用的是mvcc機制。
在非鎖定讀機制下,如何解決髒讀和不可重複讀問題?答案是使用快照思路,在事務讀取時,先得到乙份當前資料庫資料的快照,只從這個快照裡讀資料,後面的修改都不會影響這個快照。那麼真的會備份全部資料生成這個快照嗎?
不會的。之前講過資料的行格式,知道每一條資料都有rollback_pointer屬性。這個是幹嘛的?其實每乙個事務對同一行資料的修改均會被記錄到該行資料上,按照先後關係形成乙個鍊錶,而rollback_pointer指向的就是鍊錶的頭結點。這個其實是undo log,記錄了修改的內容,方便後續回滾。
所以,所謂的快照,其實就是讀資料的事務需要在讀取前,得到讀取行的乙個一致性檢視,這個檢視就是通過undo log來得到的。也就是唯讀自己可以看到的修改,遮蔽不能看到的修改。
對於rc級別,每一次普通的讀取語句都會計算出乙個檢視;而對於rr級別,因為保證需要在整個事務期間讀取到相同的值,所以會在第一次普通讀取語句計算出乙個檢視,整個事務期間就用這個檢視;
那麼如何得到事務的可見性檢視?
在事務發起讀語句時,需要記錄這麼幾個值。
1.當前事務id為a;
2.記錄當前所有活躍的事務id列表list;
3.下乙個可分配的事務idc;
然後從後往前遍歷回滾段鍊錶。拿到當前undo log裡的事務id,假設為d:
如果d > c,說明事務d是本事務之後開啟的,不可見;
如果d < a,說明事務d在本事務開啟前就已提交,可見;
否則呢,看d是否在活躍事務列表list裡,如果在,事務d還未提交,不可見,否則說明已經提交,可見;
mvcc原理 MySql事務以及MVCC機制與原理
事務 事務是一組原子性sql查詢語句,被當作乙個工作單元。若mysql對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對資料生效,若sql中任意不能執行或出錯則事務操作失敗,所有對資料的操作則無效 通過回滾恢復資料 事務有四個屬性原子性 事務被認為不可分的乙個工作...
mysql 事務及其MVCC原理
mysql事務分為四類 4種隔離級別 1.未提交讀 read uncommitted ru ru sessiona a讀取b中update中未commit中的資料,讀到的 若此時b進行了rollback回滾操作。a中讀取到的值依然是b 修改後的這個值,這就是所謂的髒讀 sessionb update...
mysql事務機制 Mysql事務機制
mysql事務是指將資料庫從一種一致性狀態轉到另一種一致性狀態 mysql事務具有acid特性 原子性 atomicity 事務中的所有操作,要麼全部執行,要麼都不執行 一致性 consistency 事務開始和結束後,資料庫的完整性不會被破壞 隔離性 isolation 事務之間互不影響。事務的隔...