wordpress .mo .po撫州網(wǎng)站seo
目錄
前言
一、事務(wù)的特性
(一)原子性
(二)一致性
(三)隔離性
(四)持久性
二、事務(wù)的控制語句
三、事務(wù)隔離級(jí)別
(一)讀未提交
(二)讀已提交
(三)可重復(fù)讀
(四)可序列化
四、使用場景
五、事務(wù)操作
(一)開啟事務(wù)
(二)提交事務(wù)
(三)回滾事務(wù)
(四)示例
六、自動(dòng)提交模式
七、隱式提交
八、提交前的保存點(diǎn)
九、注意事項(xiàng)
十、總結(jié)
前言
MySQL 中的事務(wù)是數(shù)據(jù)庫管理系統(tǒng)中用來確保多個(gè) SQL 操作以原子性的方式執(zhí)行的機(jī)制。事務(wù)可以保證一系列操作要么全部成功,要么全部失敗,從而保證數(shù)據(jù)庫的一致性和完整性。
一、事務(wù)的特性
事務(wù)具有四個(gè)重要的屬性,簡稱 ACID:
(一)原子性
事務(wù)中的所有操作要么全部成功,要么全部回滾到事務(wù)開始前的狀態(tài)。如果事務(wù)中任何一個(gè)操作失敗,整個(gè)事務(wù)都會(huì)回滾。
(二)一致性
事務(wù)的執(zhí)行不會(huì)破壞數(shù)據(jù)庫的一致性約束。即事務(wù)執(zhí)行前后,數(shù)據(jù)庫都應(yīng)該處于一致的狀態(tài)。
(三)隔離性
每個(gè)事務(wù)的操作在未提交之前,對其他事務(wù)是不可見的。事務(wù)相互獨(dú)立,即使并發(fā)執(zhí)行時(shí),事務(wù)的執(zhí)行結(jié)果與按順序執(zhí)行的結(jié)果應(yīng)當(dāng)一致。MySQL 通過不同的隔離級(jí)別來控制事務(wù)的并發(fā)執(zhí)行行為。
(四)持久性
一旦事務(wù)提交,數(shù)據(jù)庫中的數(shù)據(jù)就會(huì)被永久保存,即使系統(tǒng)崩潰,事務(wù)提交的結(jié)果也不會(huì)丟失。
二、事務(wù)的控制語句
控制語句主要有以下幾種:
-
START TRANSACTION
或BEGIN
:顯式開啟一個(gè)事務(wù)。 -
COMMIT
:提交事務(wù),表示事務(wù)中的所有操作成功執(zhí)行。 -
ROLLBACK
:回滾事務(wù),將數(shù)據(jù)庫狀態(tài)恢復(fù)到事務(wù)開始之前。 -
SAVEPOINT
:設(shè)置一個(gè)保存點(diǎn),以便在回滾時(shí)可以部分回滾到某個(gè)點(diǎn)。 -
RELEASE SAVEPOINT
:刪除保存點(diǎn)。 -
SET TRANSACTION
:設(shè)置事務(wù)的隔離級(jí)別。
三、事務(wù)隔離級(jí)別
MySQL 支持四種事務(wù)隔離級(jí)別,每種級(jí)別對并發(fā)控制的嚴(yán)格程度不同:
(一)讀未提交
事務(wù)可以讀取其他事務(wù)未提交的數(shù)據(jù),容易導(dǎo)致臟讀的問題。
(二)讀已提交
事務(wù)只能讀取其他事務(wù)已經(jīng)提交的數(shù)據(jù),避免了臟讀問題,但可能出現(xiàn)不可重復(fù)讀。
(三)可重復(fù)讀
事務(wù)執(zhí)行期間,即使其他事務(wù)修改了數(shù)據(jù),當(dāng)前事務(wù)依然只能看到執(zhí)行時(shí)的快照,避免了不可重復(fù)讀問題。MySQL 的默認(rèn)隔離級(jí)別是可重復(fù)讀,同時(shí)通過間隙鎖機(jī)制來防止幻讀
(四)可序列化
最嚴(yán)格的隔離級(jí)別,所有事務(wù)串行化執(zhí)行,完全避免了臟讀、不可重復(fù)讀和幻讀,但并發(fā)性能較差。?
四、使用場景
事務(wù)通常用于涉及多表操作、轉(zhuǎn)賬系統(tǒng)等需要保證數(shù)據(jù)一致性的場景,例如:
-
銀行轉(zhuǎn)賬:從一個(gè)賬戶扣錢,并往另一個(gè)賬戶加錢,這兩個(gè)操作必須作為一個(gè)原子操作執(zhí)行,任何一個(gè)操作失敗,整個(gè)事務(wù)都必須回滾。
-
訂單處理:生成訂單時(shí),可能涉及多個(gè)表的寫操作,比如庫存減少、賬戶扣款、訂單創(chuàng)建等,這些操作需要作為一個(gè)事務(wù)處理。
五、事務(wù)操作
事務(wù)的開啟和提交涉及到控制事務(wù)的生命周期。通過顯式開啟事務(wù),并在事務(wù)內(nèi)執(zhí)行多個(gè)操作,可以確保這些操作要么全部執(zhí)行成功并提交,要么在失敗時(shí)回滾所有操作。
(一)開啟事務(wù)
MySQL 中,可以通過 START TRANSACTION
或 BEGIN
語句顯式開啟一個(gè)事務(wù)。開啟事務(wù)后,執(zhí)行的 SQL 操作會(huì)被暫時(shí)保留,直到提交或回滾。
START TRANSACTION
:這是標(biāo)準(zhǔn)的 SQL 語法,用于啟動(dòng)一個(gè)新的事務(wù)。
START TRANSACTION;
BEGIN
:MySQL 提供的簡寫形式,與 START TRANSACTION
等效,用于開啟事務(wù)。
BEGIN;
此時(shí),MySQL 開始記錄事務(wù)中的所有操作,直到你決定提交或回滾事務(wù)。
(二)提交事務(wù)
提交事務(wù)意味著將事務(wù)中的所有操作永久保存到數(shù)據(jù)庫中。使用 COMMIT
語句可以提交當(dāng)前事務(wù)。
COMMIT;
當(dāng)事務(wù)被提交后,所有的修改都會(huì)生效,并且這些修改會(huì)對其他事務(wù)可見。同時(shí),提交后事務(wù)就結(jié)束了,后續(xù)的操作會(huì)作為一個(gè)新的事務(wù)來處理。
(三)回滾事務(wù)
如果在事務(wù)過程中發(fā)生了錯(cuò)誤,或者你決定不保存這些操作的結(jié)果,可以使用 ROLLBACK
語句回滾事務(wù)?;貪L意味著撤銷事務(wù)中的所有操作,數(shù)據(jù)庫會(huì)恢復(fù)到事務(wù)開始之前的狀態(tài)。
ROLLBACK;
回滾操作通常用于防止因事務(wù)部分失敗而導(dǎo)致數(shù)據(jù)庫處于不一致狀態(tài)。
(四)示例
以下是一個(gè)典型的事務(wù)使用流程,演示如何開啟事務(wù)、執(zhí)行多條操作,并根據(jù)情況提交或回滾事務(wù)。
-- 1. 顯式開啟事務(wù)
START TRANSACTION;-- 2. 執(zhí)行多個(gè) SQL 操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 3. 提交事務(wù)(保存所有更改)
COMMIT;-- 如果某個(gè)操作失敗,可以回滾整個(gè)事務(wù)
-- ROLLBACK;
六、自動(dòng)提交模式
默認(rèn)情況下,MySQL 處于自動(dòng)提交模式,這意味著每一條 SQL 語句都會(huì)自動(dòng)被作為一個(gè)獨(dú)立的事務(wù)執(zhí)行,并在執(zhí)行后立即提交。要顯式控制事務(wù),就需要暫時(shí)關(guān)閉自動(dòng)提交模式。
關(guān)閉自動(dòng)提交模式
可以通過設(shè)置 autocommit
為 0
來關(guān)閉自動(dòng)提交:
SET autocommit = 0;
此時(shí),MySQL 將不會(huì)自動(dòng)提交操作,必須顯式通過 COMMIT
或 ROLLBACK
來結(jié)束事務(wù)。
-- 手動(dòng)提交事務(wù)
COMMIT;-- 手動(dòng)回滾事務(wù)
ROLLBACK;
恢復(fù)自動(dòng)提交模式
在完成事務(wù)處理后,你可以將 autocommit
設(shè)置為 1
,恢復(fù)默認(rèn)的自動(dòng)提交行為:
SET autocommit = 1;
七、隱式提交
某些 SQL 語句會(huì)導(dǎo)致事務(wù)隱式提交,即不需要顯式調(diào)用 COMMIT
,事務(wù)會(huì)自動(dòng)提交。常見的隱式提交操作包括:
-
DDL 操作(如
CREATE
,DROP
,ALTER
等)會(huì)在執(zhí)行前自動(dòng)提交事務(wù),且在執(zhí)行后也會(huì)自動(dòng)提交。
示例:
-- 創(chuàng)建表之前,事務(wù)會(huì)自動(dòng)提交
CREATE TABLE new_table (id INT);
八、提交前的保存點(diǎn)
在事務(wù)中,可以通過 SAVEPOINT
設(shè)置一個(gè)保存點(diǎn),便于部分回滾事務(wù)。如果不想回滾整個(gè)事務(wù),可以使用保存點(diǎn)回滾到某個(gè)特定的點(diǎn)。
示例:
-- 開啟事務(wù)
START TRANSACTION;-- 設(shè)置保存點(diǎn)
SAVEPOINT sp1;-- 執(zhí)行一些操作
INSERT INTO orders (order_id, customer_id, total_amount) VALUES (1002, 1, 300);-- 回滾到保存點(diǎn) sp1
ROLLBACK TO sp1;-- 提交事務(wù)
COMMIT;
九、注意事項(xiàng)
事務(wù)的注意事項(xiàng)主要有以下幾點(diǎn):
-
提交事務(wù)后,所有的更改將會(huì)永久保存,無法再通過
ROLLBACK
撤銷。 -
自動(dòng)提交模式默認(rèn)開啟時(shí),每條 SQL 都是獨(dú)立事務(wù);關(guān)閉自動(dòng)提交后,必須手動(dòng)調(diào)用
COMMIT
或ROLLBACK
來結(jié)束事務(wù)。 -
在分布式數(shù)據(jù)庫中或多個(gè)系統(tǒng)間的事務(wù)處理中,還可能涉及到分布式事務(wù),通過二階段提交(2PC)等機(jī)制來保證數(shù)據(jù)的一致性。
十、總結(jié)
-
使用
START TRANSACTION
或BEGIN
來顯式開啟事務(wù)。 -
通過
COMMIT
提交事務(wù),永久保存修改。 -
如果事務(wù)中發(fā)生了問題,可以通過
ROLLBACK
撤銷操作,恢復(fù)數(shù)據(jù)庫到事務(wù)開始前的狀態(tài)。 -
在 MySQL 默認(rèn)的自動(dòng)提交模式下,所有操作會(huì)被自動(dòng)提交,如果需要手動(dòng)控制事務(wù),必須關(guān)閉自動(dòng)提交模式。