MySql中操作事務
假如我們有一個表,為account,其內容為:
ID
NAME
BALANCE
1
zhangsan
1000
2
lisi
1000
什麼是事務
比如支付寶轉賬!張三轉1000塊到李四的賬戶,這其實需要兩條SQL語句:
給張三的賬戶減去1000元;給李四的賬戶加上1000元。
如果在第一條SQL語句執行成功後,在執行第二條SQL語句之前,程序被中斷了(可能地下光纖被挖掘機挖斷了……確實存在的哦),那麼李四的賬戶沒有加上1000元,而張三卻減去了1000元。這肯定是不行的!
你現在可能已經知道什麼是事務了吧!
事務中的多個操作,要麼完全成功,要麼完全失敗!不可能存在成功一半的情況!也就是說給張三的賬戶減去1000元如果成功了,那麼給李四的賬戶加上1000元的操作也必須是成功的;否則給張三減去1000元,以及給李四加上1000元都是失敗的!
事務的四大特性(ACID)
原子性(Atomicity):事務中所有操作是不可再分割的原子單位。事務中所有操作要麼全部執行成功,要麼全部執行失敗。一致性(Consistency):事務執行後,數據庫狀態與其它業務規則保持一致。如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號余額之和應該是不變的。隔離性(Isolation):隔離性是指在並發操作中,不同事務之間應該隔離開來,使每個並發中的事務不會相互干擾。持久性(Durability):一旦事務提交成功,事務中所有的數據操作都必須被持久化到數據庫中,即使提交事務後,數據庫馬上崩潰,在數據庫重啟時,也必須能保證通過某種機制恢復數據。
MySQL中的事務
在默認情況下,MySQL每執行一條SQL語句,都是一個單獨的事務。如果需要在一個事務中包含多條SQL語句,那麼需要開啟事務和結束事務。
開啟事務:start transaction;結束事務:commit或rollback。
在執行SQL語句之前,先執行start transaction,這就開啟了一個事務(事務的起點),然後可以去執行多條SQL語句,最後要結束事務,commit表示提交,即事務中的多條SQL語句所做出的影響會持久化到數據庫中。或者rollback,表示回滾,即回滾到事務的起點,之前做的所有操作都被撤消了!
下面演示zhangsan給lisi轉賬1000元的示例:
放棄事務,轉賬失敗:
START TRANSACTION;
UPDATE account SET balance=balance-1000 WHERE id=1;
UPDATE account SET balance=balance+1000 WHERE id=2;
ROLLBACK;
提交事務,轉賬成功:
START TRANSACTION;
UPDATE account SET balance=balance-1000 WHERE id=1;
UPDATE account SET balance=balance+1000 WHERE id=2;
COMMIT;
設置回滾點:
如下,第二條update語句失效後,便COMMIT,提交了事務。
START TRANSACTION;
UPDATE account SET balance=balance-1000 WHERE id=1;
SAVEPOINT rol_01;
UPDATE account SET balance=balance+1000 WHERE id=2;
ROLLBACK TO SAVEPOINT rol_01;
COMMIT;
---完---