<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一個事務可以理解為一組操作,這一組操作要麼全部執行,要麼全部不執行。
一個事務是一個獨立的原子單元,一個事務內所有的操作,要麼全部執行,要麼全部不執行。關注的是一組操作的執行結果(全部成功or全部失敗)。是通過undo log實現的。
看了網上很多部落格對一致性的講解,總覺得沒有說到點子上,我就從我的個人角度來說說對一致性的理解:
一個事務使得資料庫從一個狀態A0,轉換到另一個狀態A1。相鄰的兩個狀態轉換之間,只能有一個事務起作用。如果當前狀態A0轉換到下一個狀態A1,之間包括了2個事務,則說明有一個事務的effect被覆蓋了。如事務並行問題中的丟失更新,典型的例子是轉賬問題,A向B轉賬,同時C也向B轉賬,最後會發現A或者C轉過去的錢不見了,這種例子隨便一搜就有,不贅述。用轉賬問題來解釋一致性,比較好理解,因為錢的總數應該是確定的,比如B本來有1000,A向B轉100,C向B轉200,那麼B賬戶上最後應該有1300,然而最終我們可能看到是1100或1200,因為有一個人的操作被覆蓋掉了。其實這也就是說,B賬戶的錢,從一個狀態,到另一個狀態,中間有2個事務起了effect,這樣是不對的。事務具有隔離性,資料庫的每一個狀態,應該都有且僅有一個與之對應的事務在take effect。
不同的事務之間,應該是不能互相影響的。
4種隔離級別
RU相當於沒有隔離,RC和RR是用MVCC實現(具體是通過undo log 和 read view),Serializable是用鎖實現,事務序列執行。
檢視當前的隔離級別
select @@tx_isolation; -- mysql 8的變數名變為如下的形式 select @@transaction_isolation; -- 設定隔離級別 set transacation_isolation = '隔離級別名'
資料庫隔離級別是一種需求,不同的隔離級別有對應的實現方式。
事務執行成功後(提交後),對資料庫的更改是永久性的(即寫到磁碟)。是通過redo log + Force Log at Commit機制實現的
事務並行問題
丟失更新
第一類丟失更新
針對同一行資料,事務A先開始,事務B後開始,事務B提交,隨後事務A回滾,則回滾會導致將事務B已提交的修改給覆蓋掉。這個問題在現在的資料庫軟體中已不會產生
第二類丟失更新
針對同一行資料,事務A先開始,事務B後開始,事務A提交,隨後事務B提交,則事務B將事務A的修改給覆蓋掉了
髒讀
事務A讀到了事務B未提交的資料,事務B後回滾,則事務A讀到的是髒資料
不可重複讀
事務A連續2次讀一行記錄,讀取到的是不一樣的。這是由於A連續2次讀的中間,事務B對這行記錄做了更新。
幻讀
表現為兩次讀取的資料數量不一致,發現變多了,或者變少了。
比如我讀取age > 10 的學生資料,第一次讀發現有10個學生,第二次讀發現有20個學生,就好像出現了幻覺一樣,同樣的查詢條件,兩次讀取發現有學生增加或減少。
事務命令
MySQL命令列下預設是autocommit的,即事務會自動提交。要顯示開啟一個事務,需使用命令BEGIN
或START TRANSACTION
BEGIN
或 START TRANSACTION
開啟事務COMMIT
提交事務ROLLBACK
回滾事務兩種並行控制策略
MVCC
Multi-Version Concurrency Control
核心理念是快照,InnoDB主要通過undo log 和 read view來實現MVCC。
**讀不加鎖,讀寫不互斥。**讀會從多個版本的資料中挑選一個合適的版本返回。寫操作會產生一個新的版本。
每一行的記錄,會包含3個隱藏欄位:row_id,tx_id,roll_ptr
其中tx_id表示最近操作該行記錄的事務id,roll_ptr則是回滾指標,指向一條undo log記錄,即指向該次改動之前的資料
insert undo log
由insert操作產生,可在事務提交後直接刪除。因為insert操作只對當前事務本身可見,其他事務不可見
update undo log
由update/delete產生。是對已有記錄的修改,為了提供MVCC機制,該undo log不能在事務提交後就刪除,而需要等待purge執行緒來進行最後的刪除
使用update修改當前行時,首先用X鎖鎖定,然後將該行當前值複製到undo log,然後再執行修改,最後填寫事務id,並使回滾指標指向undo log中修改前的行
用於判斷資料可見性的一個資料結構,裡面儲存了
若讀取到的某一行的某個版本tx_id < min_id,則說明此行的該版本在本次事務開啟之前就已經提交,故這個資料對本次事務可見。
若讀取到的某一行的某個版本tx_id >= max_id,說明此行的該版本在本次事務開啟之後才開始進行修改,故這個資料對本次事務不可見。
若讀取到的某一行的某個版本tx_id在min_id和max_id之間,則判斷此行的tx_id是否在ids內,若是,表明此行的事務還在活躍中,此行資料不可見,否則,說明此行的事務已經提交,此行資料可見
簡單來說,若在某一時刻開啟了一個事務A,則會記錄下事務A開啟時,還活躍著的其他事務(記下這些活躍事務的id,儲存為一個set,比如叫ids),這些事務按照開始的時間先後,會有從小到大的事務id(tx_id),tx_id小的事務,說明是先開啟的,tx_id大的事務,說明是後開啟的。若在事務A中,讀取到某一行資料,這一行資料的tx_id小於ids中最小的id(min_id),說明這一行資料對應的事務,已提交過了(已不活躍了),這一行資料的修改已經持久化,故該行資料對事務A來說是可見的。若這一行資料的tx_id大於或等於ids中的最大id,說明有一個事務,在事務A開始之後,才開始對這一行資料進行修改,故該行資料對事務A不可見。若這一行資料的tx_id,在min_id和max_id之間,那麼就判斷這個tx_id是不是在ids中,即對這行資料進行修改的那個事務,還在不在活躍的事務列表中,若在,說明修改這行資料的事務還沒提交,這行資料還沒持久化,故不可見,反之,說明這行資料的修改已經持久化,故可見。
RC隔離級別下,在一個事務中,每次讀取資料都會新建一個ReadView。所以可能會產生不可重複讀的問題,因為在兩次讀之間,有其他事務對資料進行了修改,而兩次讀時都新建了ReadView,故第二次讀的時候,修改後的資料是可見的。
RR隔離級別下,在一個事務中,第一次讀取時會新建一個ReadView,後序讀取都使用這個ReadView。所以哪怕在兩次讀之間,有其他事務修改了資料,也不會產生不可重複讀的問題。因為第二次讀,並沒有新建ReadView,而是使用了一開始建立的那個ReadView,所以資料可見性和第一次是一樣的。
MVCC中,讀操作分為兩類:快照讀,當前讀
-- 簡單select SELECT * FROM product;
讀取的是記錄的最新版本,當前讀返回的記錄,會加鎖,保證了其他並行事務不能修改當前記錄
SELECT * FROM product lock in share mode; SELECT * FROM product for update; insert .... update .... delete ....
LCC
Lock-Based Concurrency Control
讀加讀鎖,寫加寫鎖。讀讀不互斥,讀寫,寫寫互斥。Serilizable的隔離級別是通過LBCC實現的
以上就是MySQL學習之事務與並行控制的詳細內容,更多關於MySQL事務與並行控制的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45