事務的特性
資料庫如果支持事務,就要滿足下面四個特性(ACID),
原子性(A:Atomicity)
在一個事務中,多個sql操作,要么一起成功(所有資料操作都成功),要么一起回滾(其中一個沒有成功,其他資料操作一起恢復到開始狀態),
一致性(C:Consistency)
資料修改前是準確的,修改后也要說準確的,指的是資料從一個一致性狀態,轉換到另一種一致性的狀態,(例如:A和B總共有10個蘋果,A轉讓了幾個蘋果給B,事務結束后,A和B總共還是10個蘋果),
隔離性(I:Isolation)
當資料庫有多個事務一起執行時,各個事務之間互相不影響,每個事務感知不到有其他的事務在執行,
持久性(D:Durability)
資料庫事務結束提交后,資料修改永久有效,即使資料庫重啟,遇到其他問題關掉,再打開后,之前提交過的資料的修改還是生效的(例如:程式執行資料的操作,事務提交后,突然資料庫服務器斷電等原因導致資料庫停掉不可用,恢復后,資料還是修改后的狀態),
事務隔離級別
讀未提交
兩個事務同時操作資料庫,其中一個事物修改資料庫后,沒有提交,另一個事物可以讀取到修改過的資料,
讀已提交
有兩個事務,第一個事務查詢一條資料,第二個事務修改這條資料提交后,第一個事務又查詢該資料,第一個事務前后兩次查詢的結果不一致,
可重復讀(mysql默認隔離級別,通過MVCC<Mutil-Version Concurrency Control>機制實作)
有兩個事務,第一個事務查詢一條資料,第二個事務修改這條資料提交后(出于性能考慮,使用了以樂觀鎖為理論基礎的MVCC<多版本并發控制>來實作),第一個事務又查詢該資料,第一個事務前后兩次查詢的結果不致,
串行化(解決 幻讀 的問題)
可重復讀可以限制兩個事務并發修改洗掉資料導致前后查詢不一致的情況,但是無法限制insert(行鎖只能鎖住行,新增資料無法限制),
幻讀的案例場景:有兩個事務,第一個資料查詢串列資料條數,第二個事務新增資料到表中并提交事務,第一個事務又重新查詢資料條數,第一個事務前后兩次查詢的資料不一致,
串行化:有兩個事務,第一個事務查詢資料,第二個事務新增資料到表中,會報錯(表級鎖),不能插入資料,第一個事務再查詢資料,前后兩次結果一致,串行化并發低,
MVCC原理簡介:
通過事務id控制不同版本資料(因為通過事務id控制資料,所以下面資料中id也是會重復的),sql查詢的時候,后兩列隱藏列不會顯示,下串列格對應的事務開始順序與數字大小順序一致,最終所有事務一起結束,(通過并發情況簡單說明MVCC原理)
事務id=1插入資料;事務id=3插入資料;事務id=4洗掉資料;事務id=5修改資料;表最終資料如下:
id 資料 更新事務ID(隱藏列) 洗掉事務ID(隱藏列) 1 張三 1 4 2 小明 1 空 3 李四 1 空 4 王五 3 空 2 小明111 5 空
事務id=2,查詢全表資料,查詢資料如下:
start transaction; select * from a; //(1) select * from a; //(2) commit;
假設:
事務id=2中(1)查詢發生在事務id=1之后 ;
事務id=2中(2)查詢發生在事務id=3插入資料之后;
事務id=2兩次查詢結果都一
樣(通過事務id做了限制,只會查詢小于等于當前事務id的資料)
id 資料 更新事務ID(隱藏列) 洗掉事務ID(隱藏列) 1 張三 1 空 2 小明 1 空 3 李四 1 空
假設:
事務id=2中(1)查詢發生在事務id=1之后 ;
事務id=2中(2)查詢發生在事務id=4洗掉資料之后;
事務id=2兩次查詢結果都一樣(通過事務id做了限制,只會查詢小于等于當前事務id的資料)
id 資料 更新事務ID(隱藏列) 洗掉事務ID(隱藏列) 1 張三 1 4 2 小明 1 空 3 李四 1 空
假設:
事務id=2中(1)查詢發生在事務id=1之后 ;
事務id=2中(2)查詢發生在事務id=5修改資料之后(修改也相當于插入一條資料,資料的事務id是不同的);
事務id=2兩次查詢結果都一樣(通過事務id做了限制,只會查詢小于等于當前事務id的資料)
資料 更新事務ID(隱藏列) 洗掉事務ID(隱藏列) 1 張三 1 空 2 小明 1 空 3 李四 1 空
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/212431.html
標籤:其他
上一篇:Cassandra資料模型和模式(Schema)的配置檢查
下一篇:人人都是好朋友
