什么叫做“事務”:
想象一個場景:
小明給小花 匯款 5000元 買 IPHONE,操作界面不用管,不管什么操作界面,最終都要落實到這樣兩條語句的執行:
update 存款表 set money = money - 5000 where 賬戶=’小明’;
update 存款表 set money = money + 5000 where 賬戶=’小花’;
當,第一條語句執行成功,突然斷電了(或任何其他情況),就會造成數據的“不一致”。
要解決這個問題,就是“事務”的功能:
事務就是用來保證多條“增刪改”語句的執行的“一致性”:要么都執行完成,要么都沒有執行;
事務的特點:
- 原子性:一個事務中的所有語句,應該做到:要么全做,要么一個都不做;
- 一致性:讓數據保持邏輯上的“合理性”,比如:一個商品出庫時,既要讓商品庫中的該商品數量減1,又要讓對應用戶的購物車中的該商品加1;
- 隔離性:如果多個事務同時並發執行,但每個事務就像各自獨立執行一樣。
- 持久性:一個事務執行成功,則對數據來說應該是一個明確的硬盤數據更改(而不僅僅是內存中的變化)。
事務模式:
事務模式是指:
在我們的cmd命令行模式中,是否開啟了“一條語句就是一個事務”的這個開關:
默認情況下(安裝后),這個模式是開啟的,稱為“自動提交模式”;
set autocommit = 1;
這樣之后,每條增刪改語句,都會立即生效;
我們可以把它關閉,那就是“人為提交模式”——即需要人為提交;
set autocommit = 0;
這樣之后,所有增刪改語句,都必須使用commit之后,才能生效;
首先,我們以前的經驗都是:一條增刪改語句,一旦回車,執行就完成(前提是不出錯);
現在,我們關閉該模式:

然后,再去執行一條簡單的insert語句:
對比:
執行前:
然后,執行insert:
但是,再查看結果,即insert執行之后,數據並沒有出現:
然后,再去“人為提交”:
然后,再核查數據,就有了:
事務執行的基本流程
1,開啟一個事務:
start transaction; //也可以寫成:begin;
2,執行多條增刪改語句; //也就是相當於希望這多條語句要作為一個“不可分割”的整體去執行的任務
3,判斷這些語句執行的結果情況,並進行提交或回滾:
if( 沒有出錯 ){
commit; //提交事務;此時就是一次性完成;
}
else{
rollback; //回滾事務;此時就是全部撤銷;
}
具體分2種情況來做:
在cmd中,就是憑“肉眼”觀察是否有錯:
沒有錯誤的情況:
有錯誤的情況:
在php中:
