本文使用navcat演示mvcc機制
示例1:先創建一個表,如下圖,有id和name兩個字段
然后使用navcat打開兩個會話窗口,這兩個窗口分別作為兩個事務,如下圖
vue+MySQL,執行如下步驟
1.用鼠標選中圖二的第1行,點擊“運行已選擇的”
2.在圖一中點擊“運行”,查詢結果為數據庫中正常數據
3.用鼠標選中圖二的第2行,點擊“運行已選擇的”,此時提示修改1行數據
4.在圖一中點擊“運行”,查詢結果為數據庫中正常數據(發現圖一數據并沒有更新過來)
5.用鼠標選中圖二的第3行,點擊“運行已選擇的”
6.在圖一中點擊“運行”,發現查詢結果已被圖二更新
通過上述6步很明顯的發現:一個事務如果沒提交,數據不會被更新到數據庫中(雖然我知道這是廢話,但是我想演示通過navcat如何做到兩個事務的測試)
示例2:下面繼續測試
如下步驟操作:
1.鼠標選中圖二的1和2行(選中兩行),點擊運行
2.在圖一中點擊“運行”,此時發現左上角一直提示“正在處理”,且“停止”按鈕一直亮著,說明圖一的sql語句一直等待,其實是在等待圖二的事務執行完畢,因為圖二并沒有執行COMMIT語句,所以圖二事務一直沒有完畢,此時,其他會話不能操作id=1的這條數據
3.鼠標選中圖二的第3行,點擊運行,此時事務執行完畢,圖一的sql也執行完畢,刷新表中數據,會發現表中的數據是圖一的內容“糧糧33”,很好理解,因為圖二執行完畢之后,圖一再執行的
通過上述3步很明顯的發現:對同一條數據操作,一個事務沒執行完畢,其他會話的操作會阻塞等待(當然了,會有超時時間,挺長的)
示例3:
首先將數據庫內容恢復成初始的樣子,如下
接下來準備兩個會話sql,如下
執行如下步驟:
1.選中圖二1和2行(選中兩行),點擊“運行已選擇的”
2.選中圖二的第3行,點擊“運行已選擇的”,發現數據為糧糧11
3.選中圖一的sql,執行,發現數據依然為糧糧1
其實測試3與測試1是相同的,接下來對測試3增加一些復雜度,如示例4
MySQL nvl?示例4:
首先將數據庫內容恢復成初始的樣子,如下
接下來準備兩個會話sql,如下
執行如下步驟:
1.執行圖二的前3條sql(不要執行第4條),發現執行結果顯示糧糧11
2.執行圖一的前3條sql(不要執行第4條),發現執行結果顯示糧糧22
3.回頭刷新表,發現依然是糧糧1,刷新按鈕如下圖
有上述3步我們發現:
各自的事務,似乎自己都有一個主數據的副本,修改的時候,修改的是自己副本的數據,而不影響其他事務的數據,當該事務修改完畢并且還沒有提交的時候,此時查詢數據,發現數據符合預期,是剛修改過的數據,而其他數據查詢的時候,同樣符合預期,是沒修改過的數據,因為是多個事務,涉及到并發問題,那么這種正確的,符合預期的行為,Mysql是如何做到的呢?Mysql采用一個叫MVCC的機制,其實通過上述內容,我們大概能才出來,是通過副本機制(自己改自己的),下面具體闡述MVCC
未完待續
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态