柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 - MySQL的事務(wù)
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 - MySQL的事務(wù)
目錄
前言
一、事務(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ù)的操作在未提交之前,對(duì)其他事務(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í)別對(duì)并發(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ì)對(duì)其他事務(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)提交模式。
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 - MySQL的事務(wù)
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。