MySQL學習之事務(wù)控制

MySQL學習之事務(wù)控制

什么是事務(wù)控制

事務(wù)是指作為一個邏輯工作單元執(zhí)行的一系列操作,這些操作要么全部成功要么全部失敗。事務(wù)確保了多個數(shù)據(jù)的修改作為一個單元來處理。

  • mysql中,只有使用了Innodb存儲引擎的數(shù)據(jù)庫或表才支持事物
  • 事務(wù)用于維護數(shù)據(jù)庫的完整性,保證成批的sql語句要么都執(zhí)行,要么都不執(zhí)行
  • 事務(wù)用于管理INSERTUPDATEdelete語句

假如,張三在ATM機上給李四轉(zhuǎn)賬100元,在銀行的業(yè)務(wù)系統(tǒng)中,主要會執(zhí)行兩步數(shù)據(jù)變更操作:

  1. 從張三的賬戶減去100元
  2. 給李四的賬戶增加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 transactionbegin,或者將autocommit的值設(shè)置為0.

  • 方法一:MySQL學習之事務(wù)控制
  • 方法二:MySQL學習之事務(wù)控制

例子

  1. 登陸數(shù)據(jù)庫,使用student數(shù)據(jù)庫并查看所有的數(shù)據(jù)表
USE student;SHOW TABLES;

MySQL學習之事務(wù)控制
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;

MySQL學習之事務(wù)控制
3. 查看默認的autocommit值

SELECT @@autocommit;

MySQL學習之事務(wù)控制
4. 查看bank_account數(shù)據(jù)表所有記錄

SELECT * FROM bank_account;

MySQL學習之事務(wù)控制
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;

MySQL學習之事務(wù)控制
6. 查看此時數(shù)據(jù)表的內(nèi)容

SELECT * FROM bank_account;

MySQL學習之事務(wù)控制
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;

MySQL學習之事務(wù)控制
8. 再次查看數(shù)據(jù)表內(nèi)容,發(fā)現(xiàn)回滾之后數(shù)據(jù)無變化

SELECT * FROM bank_account;

MySQL學習之事務(wù)控制
注:本文是博主MySQL學習的總結(jié),不支持任何商用,轉(zhuǎn)載請注明出處!如果你也對MySQL學習有一定的興趣和理解,歡迎隨時找博主交流~

更多相關(guān)免費學習推薦:mysql教程(視頻)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊12 分享