作為乙個後端工程師,想必沒有人沒用過資料庫,跟我一起複習一下mysql吧,本文是我學習《mysql實戰45講》的總結筆記的第二篇,總結了mysql的事務隔離級別。
所謂隔離,它源自於我們熟知的事務的acid四大特性之一的isolation隔離性。
如果事務之間不隔離,那麼可能會發生以下幾個問題:
(1)髒讀
髒讀指的是讀到了其他事務未提交的資料,而這些資料可能會被回滾。
(2)不可重複讀
不可重複讀值的是在同一事務內,不同時刻讀到的同一批資料可能是不一樣的,可能會受到其他事務的影響,比如其他事務改了這批資料並提交了。通常針對update操作。
(3)幻讀
幻讀指的是乙個事務在進行一次查詢之後發現某個記錄不存在,然後會根據這個結果進行下一步操作,此時如果另乙個事務成功插入了該記錄,那麼對於第乙個事務而言,其進行下一步操作(比如插入該記錄)的時候很可能會報錯。通常針對insert操作。
為了解決這些問題,在mysql中,提供了如下四種事務的隔離級別:
讀提交(read committed)
可重複讀(repeatable read):預設隔離級別
序列化(searializable)
如上四種隔離級別,並行效能依次降低,安全性則依次提高!
在mysql中,可以通過以下命令檢視當前設定的事務隔離級別,預設隔離級別為可重複讀(repeatable read)。
mysql> show variables like如果要修改預設隔離級別為讀提交:(以下為修改全域性事務隔離級別)'transaction_isolation
';
mysql>事務隔離是為了解決髒讀、不可重複讀、幻讀這幾個問題,下圖展示了這四種隔離級別對這三個問題的解決程度:set global transaction
isolation
level
read
committed;
可以看到,只有序列化的隔離級別解決了全部問題,其他的隔離級別都各有缺陷。不過,序列化雖然可以解決所有問題,但是併發效能最差。
現在我們來看乙個小練習,假設我們通過以下語句建立一張表t,並向表t插入了乙個新數值1:
mysql>然後,看看如下所示的,假設有兩個事務分別啟動,看看在不同的隔離級別下不同事務查詢得到的值v1、v2和v3分別是多少?create
table t(c int) engine=innodb;insert
into t(c) values(1);
(1)隔離級別=讀未提交,v1=v2=v3=2
(2)隔離級別=讀提交,v1=1,v2=v3=2
(3)隔離級別=可重複讀,v1=v2=1,v3=2
(4)隔離級別=序列化,v1=v2=1,v3=2
在mysql中,每條記錄在更新的時候都會同時記錄一條回滾操作。因此,記錄上的最新的值,通過回滾操作,可以得到前乙個狀態的值。換句話說,同一條記錄在系統中可以存在多個版本,這其實就是mysql資料庫的多版本併發控制(mvcc)。
綜述,可以說mysql事務隔離的實現基礎是基於多版本併發控制mvcc的,而具體的實現方式就是回滾日誌。即每個事務的都會在自己的一致性讀檢視(consistent read view,這個檢視沒有物理結構,用來在事務執行期間定義「我能看到什麼資料」)中對記錄進行操作,並記錄回滾日誌,但是不同事務之間是不會衝突的。
鑑於此,由於長事務會存在很老的事務檢視,在其未提交之前,可能用到的所有回滾記錄都需要保留,會占用大量儲存空間。所以,建議盡量不要使用長事務!
如果必須要用,那麼需要對其進行監控,下面的語句可以指導我們查詢時間超過60s的長事務:
--在實踐中,mysql的事務啟動方式有以下兩種:查詢持續時間超過60s的長事務
select
*from information_schema.innodb_trx where time_to_sec(timediff(now(),trx_started))>
60
(1)顯示啟動事務(begin/start transaction -> commit/rollback)
(2)顯示關閉自動提交(set autocommit=0)
本文總結了mysql的事務隔離級別、實現方式 及 啟動方式,可以幫助我們使用好mysql的事務特性。
林曉斌(丁奇),《mysql實戰45講》
MySQL核心知識學習之路(4)
作為乙個後端工程師,想必沒有人沒用過資料庫,跟我一起複習一下mysql吧,本文是我學習 mysql實戰45講 的總結筆記的第四篇,總結了mysql的鎖相關知識。所謂全域性鎖,就是對整個資料庫例項加鎖,其命令為 mysql flush tables with read lock 以下該命令會簡稱為ft...
Web Service核心知識
xml,soap和wsdl就是構成webservice平台的三大技術。xml webservice採用http協議傳輸資料,採用xml格式封裝資料,即xml中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼。xml是webservice平台中表示資料的格式。除了易於建立...
Hadoop核心知識
一 hadoop核心 hdfs hadoop distributed file system 分布式檔案系統 用於海量資料的儲存 yarn yet another resource negotiator 資源管理排程系統,用於資源管理排程 map reduce 分布式運算框架,用於海量資料的分析 二...