天天看點

mysql之事務 | 事務的四大特性

事務 📖

事務四大特性(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
           
mysql之事務 | 事務的四大特性
但是在事務裡邊這個資料還沒有到硬碟中,還沒有儲存。
現在這個狀态還可以回退(我反悔了我不買了)
復原操作:rollback;
           
mysql之事務 | 事務的四大特性
确認資料:确認支付成功不反悔了
commit;
           
mysql之事務 | 事務的四大特性

結論:在事務下面的操作 要麼同時成功要麼同時失敗可以回退,事務在送出後是在記憶體中,沒有重新整理到硬碟必須執行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;
           

繼續閱讀