事務 📖
事務四大特性(ACID):
A: 原子性
每個事務都是不可分割的最小機關(同一個事物内的多個操作要麼同時成功要麼同時失敗)
C: 一緻性
執行完事務之後資料庫的資料狀态(從一個狀态變為另一個狀态)
I: 隔離性
事務與事務之間彼此不幹擾
D: 持久性
一個事務一旦送出,它對資料庫中資料的改變就應該是永久性的。
實際案例比喻什麼是事務:
我們來看一個現象:
準備三個身份:
小明
ATM機
小強
小明用建行的卡通過農行的ATM機給工行小強轉1000元,
那麼建行就會給小明的卡減1000元
共行就會給小強的卡增加1000元。(其實你的錢就是一個sql語句)
那麼這時候會不會産生這樣一個現象:在轉錢的過程中工行的系統出現了問題,小明的卡明明已經減了1000元,但是小強的卡因工行系統問題并沒有增加那1000元。
這種情況在之前是常有發生的。
那麼這個時候怎麼解決這個問題呢?
這裡發明了事務:同時改變狀态,要麼同時成功要麼同時失敗。(我不增加錢對方就不會減錢,對方減了錢數那我肯定增加錢)
補充:
# 開啟事務:(下面的所有操作都包含在一個事務裡邊:下面的操作要麼同時成功要麼同時失敗 可以回退)
start transaction;
# 如何復原:
rollback;
# 如何确認:
commit;
執行個體:
# 模拟消費
create table user(
id int primary key auto_increment,
name char(32),
balance int # 存款
);
insert into user(name,balance) values ('gary',1000),('jack',1000),('tom',1000);
start transaction; # 開啟事務
# 修改操作
update user set balance=900 where name='gary'; # 支付100元
update user set balance=1010 where name='jack'; # 中介拿走10元
update user set balance=1090 where name='tom'; # 收款方收到90
但是在事務裡邊這個資料還沒有到硬碟中,還沒有儲存。
現在這個狀态還可以回退(我反悔了我不買了)
復原操作:rollback;
确認資料:确認支付成功不反悔了
commit;
結論:在事務下面的操作 要麼同時成功要麼同時失敗可以回退,事務在送出後是在記憶體中,沒有重新整理到硬碟必須執行commit;确認才會重新整理到硬碟 整個事務結束。
使用python代碼來完善事務實作僞代碼邏輯:
try: # 判斷異常
update user set balance=900 where name='gary'; # 支付100元
update user set balance=1010 where name='jack'; # 中介拿走10元
update user set balance=1090 where name='tom'; # 收款方收到90
except 異常: # 如果有異常就復原
rollback;
else: # 無異常則儲存解釋事務
commit;