天天看點

MySQL複習資料(八)——MySQL-事務

????導讀????

✍本文由在下【紅目香薰】原創

????2022年最大願望:【服務百萬技術人】????

????前言????

本文屬于系列文章,分别為:

MySQL複習資料(一)——MySQL環境安裝

MySQL複習資料(二)——MySQL-DDL語句

MySQL複習資料(三)——MySQL-DML語句

MySQL複習資料(四)——MySQL-聚合函數

MySQL複習資料(五)——MySQL-索引

MySQL複習資料(六)——MySQL-多表聯合查詢

MySQL複習資料(七)——MySQL-存儲過程

MySQL複習資料(八)——MySQL-事務

MySQL複習資料(九)——MySQL-圖形化工具使用

????正文????

MySQL複習資料(八)——MySQL-事務

​目錄​

事務的概念

事務的基本特性

事務的基本操作

事務示例

事務的概念

現實生活中,人們經常會進行轉賬操作,轉賬可以分為轉入和轉出兩部分,隻有這兩個部分都完成才認為轉賬成功。在資料庫中,這個過程是使用兩條SQL語句來實作的,如果其中任意一條語句出現異常沒有執行,則會導緻兩個賬戶的金額不同步,造成錯誤。為了防止上述情況的發生,就需要使用MySQL中的事務(Transaction)。

在MySQL中,事務就是針對資料庫的一組操作,它可以由一條或多條SQL語句組成,且每個SQL語句是互相依賴的。隻要在程式執行過程中有一條SQL語句執行失敗或發生錯誤,則其他語句都不會執行。也就是說,事務的執行要麼成功,要麼就傳回到事務開始前的狀态,這就保證了同一事務操作的同步性和資料的完整性。

事務的基本特性

​MySQL中的事務必須滿足A、C、I、D這4個基本特性,具體如下:​

(1)原子性(Atomicity)。原子性是指一個事務必須被視為一個不可分割的最小工作單元,隻有事務中所有的資料庫操作都執行成功,才算整個事務執行成功。事務中如果有任何一個SQL語句執行失敗,已經執行成功的SQL語句也必須撤銷,資料庫的狀态退回到執行事務前的狀态。

(2)一緻性(Consistency)。一緻性是指在事務處理時,無論執行成功還是失敗,都要保證資料庫系統處于一緻的狀态,保證資料庫系統不會傳回到一個未處理的事務中。MySQL中的一緻性主要由日志機制實作,通過日志記錄資料庫的所有變化,為事務恢複提供了跟蹤記錄。

(3)隔離性(Isolation)。隔離性是指當一個事務在執行時,不會受到其他事務的影響。保證了未完成事務的所有操作與資料庫系統的隔離,直到事務完成為止,才能看到事務的執行結果。隔離性相關的技術有并發控制、可串行化、鎖等。當多個使用者并發通路資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個并發事務之間要互相隔離。

(4)持久性(Durability)。持久性是指事務一旦送出,其對資料庫的修改就是永久性的。需要注意的是,事務的持久性不能做到百分百的持久,隻能從事務本身的角度來保證永久性,而一些外部原因導緻資料庫發生故障,如硬碟損壞,那麼所有送出的資料可能都會丢失。

事務的基本操作

在預設情況下,使用者執行的每一條SQL語句都會被當成單獨的事務自動送出。如果要将一組SQL語句作為一個事務,則需要先執行以下語句顯式地開啟一個事務。

START  TRANSACTION;      

上述語句執行後,每一條SQL語句不再自動送出,使用者需要使用以下語句手動送出,隻有事務送出後,其中的操作才會生效。

COMMIT;      

如果不想送出目前事務,可以使用如下語句取消事務(即復原)。

ROLLBACK;      

需要注意的是,ROLLBACK隻能針對未送出的事務復原,已送出的事務無法復原。當執行COMMIT或ROLLBACK後,目前事務就會自動結束。

事務示例

​復原成功​

start transaction;

update users set introduce = 'My Heart Will Go On.' where id=1;

update users set introduce = 'Some on like you.' where id=2;

rollback;

select * from users;      
MySQL複習資料(八)——MySQL-事務

​送出成功​

start transaction;

update users set introduce = 'My Heart Will Go On.' where id=1;

update users set introduce = 'Some on like you.' where id=2;

commit;

select * from users;