我們在建表的時候通常會在最後聲明引擎類型,這次我們就來看看存儲引擎都有哪些: 舉個例子: 銀行轉賬: 張三想給李四轉500元錢: 張三-500 李四+500 這兩步必須都完成,轉賬才完成 像這種,2步或N步必須都完成,從邏輯上講,是一個‘原子操作’,即要麼成功,要麼都不成功 那麼如何保障這種特性? ...
我們在建表的時候通常會在最後聲明引擎類型,這次我們就來看看存儲引擎都有哪些:
舉個例子:
---------------------------
銀行轉賬:
張三想給李四轉500元錢:
張三-500
李四+500
這兩步必須都完成,轉賬才完成
---------------------------
像這種,2步或N步必須都完成,從邏輯上講,是一個‘原子操作’,即要麼成功,要麼都不成功
那麼如何保障這種特性?
答:事務
我們先建兩張不同引擎的表,分別是b1,b2:
插入數據:
我們來體現innodb引擎具有的事務特性:
開啟事務,體現事務的原子特性:
start transaction;
先給張三減500:
update b2 set money=money-500 where uname='zhangsan';
然後我們故意寫錯語句來模擬轉賬時出現網路故障等失敗場景:
轉賬必須一個-500,一個+500,這樣才成立,那麼只有一個-500,另一個+500是失敗的操作,那麼我們就要進行回滾:
rollback;
事務有四種特性,上面我們演示的是原子性,它還有一致性,隔離性,永久性;以下知識摘自百度百科:
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency)。事務必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對資料庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
持久性:
是指事務一旦完成,無法撤銷
事務不能撤銷,但確實出現了一次錯誤的交易,應該怎麼辦?
答:只能再做一次“補償性事務”
接下來我們演示它的隔離性:
還是轉賬操作,我們用黑色模擬櫃臺,用紅色來模擬ATM機
讓李四給張三轉500,(那麼應該就是張三的錢+500,李四的錢-500.)
我們先給張三+500:
我們可以看到在櫃臺這邊張三的錢已經加了500,那麼看看ATM機那邊的情況:
我們可以看到這邊沒有任何變化;
然後讓李四-500:
可以看到ATM機這邊還是沒有任何變化。
然後我們結束事務:
這時我們再看ATM機那邊的情況:
可以看得到這邊的錢數目終於發生了變化。
以上就是我簡單的為大家演示的事務的隔離性。