c:一致性(consistency)
i:隔離性(isolation)
d:永續性(durability)
隔離性可能引發的問題,和隔離級別
隔離級別:
總結acid
原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)
一次操作是不可分割的,要麼全部成功,要麼全部失敗。比如我們的轉賬操作,不允許出款方成功,收款方失敗這種情況,要麼都成功,要麼多失敗,不可能出現中間狀態。
innodb 引擎使用 undo log(歸滾日誌)來保證原子性操作,你對資料庫的每一條資料的改動(insert、delete、update)都會被記錄到 undo log 中,比如以下這些操作:
當事務執行失敗或者呼叫了 rollback 方法時,就會觸發回滾事件,利用 undo log 中記錄將資料回滾到修改之前的樣子。
一致性簡單一點說就是資料執行前後都要處於一種合法的狀態,比如身份證號不能重複,性別只能是男或者女,高考的分數只能在0~750之間,紅綠燈只有3種顏色,房價不能為負的等等, 只有符合這些約束的資料才是有效的,比如有個小孩兒跟你說他高考考了1000分,你一聽就知道他胡扯呢。資料庫世界只是現實世界的乙個對映,現實世界中存在的約束當然也要在資料庫世界中有所體現。如果資料庫中的資料全部符合現實世界中的約束(all defined rules),我們說這些資料就是一致的,或者說符合一致性的。
要保證資料庫的資料一致性,要在以下兩個方面做努力:
多個事務併發執行的時候,事務內部的操作與其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
在下面innodb 引擎是如何保證隔離性的?利用鎖和 mvcc 機制。這裡簡單的介紹一下 mvcc 機制,也叫多版本併發控制,在使用 read committd、repeatable read 這兩種隔離級別的事務下,每條記錄在更新的時候都會同時記錄一條回滾操作,就會形成乙個版本鏈,在執行普通的 select 操作時訪問記錄的版本鏈的過程,這樣子可以使不同事務的讀-寫、寫-讀操作併發執行,從而提公升系統效能。
事務一旦提交,它對資料庫的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
要保證永續性很簡單,就是每次事務提交的時候,都將資料刷磁碟上,這樣一定保證了安全性,但是要知道如果每次事務提交都將資料寫入到磁碟的話,頻繁的 io 操作,成本太高,資料庫的效能極低,所以這種方式不可取。
innodb 引擎是怎麼解決的?innodb 引擎引入了乙個中間層來解決這個永續性的問題,我們把這個叫做 redo log(歸檔日誌)。
為什麼要引入 redo log?redo log 可以保證持久化又可以保證資料庫的效能,相比於直接刷盤,redo log 有以下兩個優勢:
innodb 引擎是怎麼做的?當有一條記錄需要更新的時候,innodb 引擎就會先把記錄寫到 redo log 裡面,並更新記憶體,這個時候更新就算完成了。當資料庫宕機重啟的時候,會將 redo log 中的內容恢復到資料庫中,再根據 undo log和 binlog 內容決定回滾資料還是提交資料。
事務的隔離性:多個事務併發執行的時候,事務內部的操作與其他事務是隔離的,併發執行的各個事務之間不能互相干擾。(像是多執行緒的概念)
而隔離性就可能引起:髒讀(dirty read)、不可重複讀(non-repeatable read)、幻讀(phantom read)等問題,(就是執行緒安全問題)
前者是指在乙個事務過程中讀到了另乙個事務已經提交事務的更改資料(修改或刪除);
後者是指在乙個事務過程中讀到了另乙個事務已經提交事務的新增資料。
對於這兩種問題解決採用不同的辦法:
解決不可重複讀,只需對操作的資料新增行級鎖,防止操作中的資料發生變化;(行級鎖鎖不住新增資料,就可能導致兩次查詢數目不一致)
解決幻讀,往往需要新增表級鎖,將整張表鎖定,防止新增資料(oracle採用多版本資料的方式實現)。
sql 標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable):
隔離級別越高,效率越慢。
**從上到下級別越來越高,mysql預設是repeatable read級別
隔離級別/問題
髒讀不可重複讀
幻讀讀未提交(read uncommitted)
可能可能
可能讀提交(read committed)
不可能可能
可能可重複讀 (repeatable read)
不可能不可能
可能序列化(serializable)
不可能不可能
不可能mysql命令
命令含義
select version()
檢視mysql版本
select @@tx_isolation
檢視mysql隔離級別
set session transaction isolation level 隔離級別名
會話層面設定隔離級別
start transaction
開啟事務
commit
提交事務
rollback
回滾事務
事務的四大特性和隔離級別
事務,其定義是應用程式中一系列不可分割的操作,就是一組可以完成某個業務的 集合,在關聯式資料庫中,事務可以是一條sql語句,或者一組sql語句,亦或整個程式。其中事務有四個特徵,必須同時滿足這四個特徵才是乙個完整的事務。即事務的acid特性 原子性 atomicity 即事務是資料庫的不可分割單元,...
事務的四大特性和隔離級別
在資料庫操作中,一項事務 transaction 是由一條或多條運算元據庫的 sql 語句組成的乙個不可分割的工作單元,這些操作要麼都完成,要麼都取消。接下來將圍繞事務的特性 併發問題以及隔離級別進行講解。事務的定義很嚴格,它必須同時滿足四個特性,即原子性 一致性 隔離性和永續性,也就是人們俗稱的 ...
事務的四大特性和隔離級別
事務又分為本地事務和分布式事務 本地事務也稱為資料庫事務或傳統事務 相對於分布式事務而言 它的執行模式就是常見的 transaction begin insert delete update insert delete update transaction commit rollback 本地事務有...