什么是事務(wù)控制
事務(wù)是指作為一個邏輯工作單元執(zhí)行的一系列操作,這些操作要么全部成功,要么全部失敗。事務(wù)確保了多個數(shù)據(jù)的修改作為一個單元來處理。
- 在mysql中,只有使用了Innodb存儲引擎的數(shù)據(jù)庫或表才支持事物
- 事務(wù)用于維護數(shù)據(jù)庫的完整性,保證成批的sql語句要么都執(zhí)行,要么都不執(zhí)行
- 事務(wù)用于管理INSERT、UPDATE和delete語句
假如,張三在ATM機上給李四轉(zhuǎn)賬100元,在銀行的業(yè)務(wù)系統(tǒng)中,主要會執(zhí)行兩步數(shù)據(jù)變更操作:
- 從張三的賬戶減去100元
- 給李四的賬戶增加100元
試問,如果操作1執(zhí)行成功,操作2執(zhí)行失敗會發(fā)生什么?
相關(guān)免費學習推薦:mysql視頻教程
事務(wù)的四個特性
如果某個數(shù)據(jù)庫支持事務(wù),那么該數(shù)據(jù)庫必須具備ACID四個特性,即Atomicity(原子性)、Consistency(一致性)、Isolation(隔離性)、Durability(持久性)。
- 原子性:事務(wù)必須是原子工作單元,事務(wù)中包含的各操作要么都做,要么都不做
- 一致性:事務(wù)在執(zhí)行完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)
- 隔離性:事務(wù)獨立運行。多個事務(wù)之間相互隔離,互不干擾。事務(wù)的100%隔離,會犧牲速度
- 持續(xù)性:事務(wù)執(zhí)行完成之后,它對系統(tǒng)的影響是永久性的
MySQL的事務(wù)控制
在默認情況下,MySQL是自動提交事務(wù)的,即每一條INSERT、UPDATE、DELETE的SQL語句提交后會立即執(zhí)行COMMIT操作。因此,要開啟一個事務(wù),可以使用start transaction或begin,或者將autocommit的值設(shè)置為0.
- 方法一:
- 方法二:
例子
- 登陸數(shù)據(jù)庫,使用student數(shù)據(jù)庫并查看所有的數(shù)據(jù)表
USE student;SHOW TABLES;
2. 創(chuàng)建bank_account數(shù)據(jù)表并插入兩條記錄,設(shè)置張三的balance字段值+1000
CREATE TABLE bank_account( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) COMMENT '姓名', balance DECIMAL(18, 2) COMMENT '賬戶余額');INSERT INTO bank_account(id, name, balance) VALUE(1, '張三', 0);INSERT INTO bank_account(id, name, balance) VALUE(2, '李四', 0);UPDATE bank_account SET balance = balance + 1000 WHERE id = 1;
3. 查看默認的autocommit值
SELECT @@autocommit;
4. 查看bank_account數(shù)據(jù)表所有記錄
SELECT * FROM bank_account;
5. 開始事務(wù)控制并執(zhí)行兩條SQL語句
START TRANSACTION;UPDATE bank_account SET balance = balance - 100 WHERE id = 1;UPDATE bank_account SET balance = balance + 100 WHERE id = 2;COMMIT;
6. 查看此時數(shù)據(jù)表的內(nèi)容
SELECT * FROM bank_account;
7. 再次開始事務(wù)控制,同樣插入兩條一樣的SQL語句,但將commit(提交)變?yōu)閞ollback(回滾)
START TRANSACTION;UPDATE bank_account SET balance = balance - 100 WHERE id = 1;UPDATE bank_account SET balance = balance + 100 WHERE id = 2;ROLLBACK;
8. 再次查看數(shù)據(jù)表內(nèi)容,發(fā)現(xiàn)回滾之后數(shù)據(jù)無變化
SELECT * FROM bank_account;
注:本文是博主MySQL學習的總結(jié),不支持任何商用,轉(zhuǎn)載請注明出處!如果你也對MySQL學習有一定的興趣和理解,歡迎隨時找博主交流~
更多相關(guān)免費學習推薦:mysql教程(視頻)