標籤:mysql 事務
簡述事務的概念:
為什麼引入事務?
當我們有時候需要執行好多條語句的時候,由於某些原因,導致只有第一條語句執行了,那產生的結果就是千差萬別的。
事務的特性是ACID
原子性(Atomicity):
事務是資料庫的邏輯工作單位,事務中包含的操作要麼都執行,要麼都不執行。
一致性(Consistent):
事務執行的結果必須是從一個一致性狀態遷移到另一個一致性狀態。(網上找到的一段話:一致性就是資料庫的資料狀態符合資料庫所描述的商務邏輯和規則)。A賬戶增加100 B賬戶就要減少100 這就是一致性 ,保證他的操作 就是倆個更新同時執行成功,否則一起失敗!如果一個執行失敗,那麼就會產生不一致性,平白無故多了或少了100元,資料庫狀態就處於不一致狀態。
隔離性(Isolation):
一個事務的執行不能被其他事務幹擾,一個事務內部的操作及使用的資料對並發的其他事務是隔離的,即並發執行的事務之間不能互相干擾。
持久性(Durable):
事務一旦提交,對資料庫中資料的改變是永久性的,其餘任何故障也能夠保持
並發事務帶來的問題(破壞了隔離性):
更新丟失:
每個事務不知道其他事務的存在,當事務A對原資料修改後提交事務,而此時B也正在對原資料進行修改,因為A比B提交的早,所以A提交的事務會覆蓋原資料,而B提交的事務會覆蓋A提交的事務。
髒讀:
一個事務在對某一資料修改後,然後另一個事務讀取到該值,第一個事務此時由於某種原因撤銷以前修改的資料,那麼第二個事務讀取到的值就是無效的,這些資料為髒資料。
不可重複讀取:
一個事務在讀取資料後,再次讀取該資料,發現第二次讀取到的資料和第一次讀取的不一致。
幻讀:
一個事務按照相同檢索條件重新讀取以前讀取過的資料,發現其他事務插入了一些滿足其查詢條件的新資料。這裡容易和不可重複讀取混淆,只要記住不可重複讀取是指修改,側重不一致;而幻讀側重新資料,比以前的多。
交易隔離等級:
資料庫實現隔離性的方式分為兩種:
悲觀鎖:
在讀取資料前,會對其加鎖,阻止其他事務對資料進行修改。
傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
樂觀鎖:
在讀取資料前,不會加鎖。但是會通過一定機制產生一個資料請求時間點的一致性資料快照檔案,用這個快照來提高一定層級的一致性讀取。
從使用者的角度來說,好像是資料庫對同一資料提供了多個版本,因此這種技術也稱MVCC(資料多版本並發控制)。樂觀鎖適用於多讀的應用類型,這樣可以提高輸送量
InnoDB中MVCC的實現:
這種資料版本記錄機制實現,是給資料庫表加了一個版本號碼(Version)欄位,讀取資料時,連版本號碼一共讀取出來,當更新資料時,給此版本號碼加1,將提交資料的的版本號碼與原資料表中的版本號碼比較,大於才可以更新,否則認為是到期資料。
四種隔離等級比較:
隔離等級 |
髒讀(Dirty Read) |
不可重複讀取(NonRepeatable Read) |
幻讀(Phantom Read) |
未提交讀(Read uncommitted) |
可能 |
可能 |
可能 |
已提交讀(Read committed) |
不可能 |
可能 |
可能 |
可重複讀(Repeatable read) |
不可能 |
不可能 |
可能 |
可序列化(Serializable ) |
不可能 |
不可能 |
不可能 |
· 未提交讀(Read Uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料
· 提交讀(Read Committed):只能讀取到已經提交的資料。Oracle等多數資料庫預設都是該層級 (不重複讀)
· 可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB預設層級。在SQL標準中,該隔離等級消除了不可重複讀取,但是還存在幻象讀
· 串列讀(Serializable):完全序列化的讀,每次讀都需要獲得表級共用鎖定,讀寫相互都會阻塞
分散式交易:
Mysql從5.0.3開始支援分散式交易,當前分布式只支援InnoDB儲存引擎。
我們來大致瞭解一下分散式交易的原理(有點像Hadoop的主從式結構):
在Mysql中,使用分散式交易的應用程式涉及一個或多個資源管理員和一個交易管理員。
資源管理員(RM):用於提供通向事務資源的途徑。資料庫伺服器就是一種資源管理員,該管理器必須可以提交或復原由RM管理的事務。
交易管理員(TM):用於協調作為一個分散式交易一部分的事務,TM與管理每個事務的RMs通訊。
執行分散式交易分為兩個階段:
1、TM告知所有分支準備提交,分支指示是否它們可以這麼做。
2、TM告知RMs是否要提交或復原。如果在預備階段,所有分支都指示可以提交,則所有分支被告知提交。如果在預備時,有任何分支指示不能被提交,則所有的分支都會被告知復原。
參考:
一分鐘教你知道樂觀鎖和悲觀鎖的區別
Innodb中的交易隔離等級和鎖的關係深入淺出Mysql資料庫開發、最佳化與管理維護.第二版
著作權聲明:本文為博主原創文章,轉載請註明出處。
Mysql之事務