MySQL事務處理及鎖定
事務處理(Transaction)是將多個更新命令作為一個整體來執行,從而保證數據整合性的機制。
www.2cto.com
存儲引擎(Storage Engine)
MySQL 有一個重要特征,即:可替換存儲引擎構架(Pluggable Storage Engine Architecture)
MySQL 的功能分為 2 個部分,
外層部分:負責完成與客戶端的連接、對 SQL 語句進行事前檢查等。
內層部分:存儲引擎部分,負責接收外層的數據操作指示,完成實際的數據輸入輸出以及文件操作。
MySQL 提供了多種存儲引擎,用戶可自由選擇(也可以給不同的表,選擇不同的存儲引擎)
用戶可以任意選擇存儲引擎,這是 MySQL 獨有的特征。
MyISAM :默認的高速引擎,不支持事務處理
InnoDB :支持行鎖定,以及事務處理,比 MyISAM 的處理速度稍慢
ISAM :MyISAM 引擎的前身。MySQL 5.0 以後,不再標准安裝
MERGE : 該引擎,會將多個 MyISAM 類型的表,作為一個表來處理
MEMORY, HEAP : 只在內存上保存數據
Falcon :一種新的存儲引擎,支持事務處理
ARCHIVE: 將數據壓縮後保存 (只能進行 INSERT / SELECT 操作)
CSV : 以CSV 形式保存數據(應用於跨平台數據交換)
my.ini 中, 設置:default-storage-engine=INNODB
才能使用 InnoDB 引擎,來支持事務處理
[sql]
SHOW CREATE TABLE customer;
SHOW CREATE TABLE customer\G
[sql]
ALTER TABLE customer ENGINE=MyISAM;
為什麼需要事務處理?
例如:甲,向乙轉賬1 萬元。
需要2個操作,甲的賬戶減少 1萬,乙的賬戶增加 1萬。
如果,甲賬戶減少 1萬之後,乙賬戶卻沒有相應增加1萬,則發生錯誤。
為避免此類情況,將2個操作作為一個事務來處理,2個操作都成功,則事務結束,進行提交(COMMIT)。
如果 其中1個操作失敗,則強制返回最初的狀態,即:回滾(ROLLBACK)
這樣,能保證,要麼2個操作都成功,要麼2個操作都失敗。
執行ROLLBACK 等事務操作,要確保當前的數據庫引擎是支持事務操作的。如:InnoDB
[sql]
BEGIN; -- 或者 START TRANSACTION
DELETE FROM customer;
SELECT * FROM customer;
ROLLBACK;
自動提交的功能,默認是開啟的。
[sql]
SELECT @@AUTOCOMMIT;
SET AUTOCOMMIT=0; --關閉自動提交功能
SELECT * FROM customer;
DELETE FROM customer;
ROLLBACK; -- 關閉自動提交,無需 BEGIN 操作,也能使用 ROLLBACK
/* 這種情況下,如果不執行 COMMIT 操作,則所有更新不會反映到數據庫中 */
部分回滾
[sql]
BEGIN;
INSERT INTO customer VALUES('T0001', '王二', '1980-10-21', 1);
SAVEPOINT sp;
INSERT INTO customer VALUES('T0002', '田三', '1985-10-21', 1);
SELECT * FROM customer;
ROLLBACK TO SAVEPOINT sp;
SELECT * FROM customer;
ROLLBACK;
SELECT * FROM customer;
以下 SQL 命令,執行後會被自動提交。它們不在事務處理的控制范圍之內。
[sql]
DROP DATABASE;
DROP TABLE;
DROP;
ALTER TABLE;
多用戶同時讀取數據庫時候,為防止沖突,可使用鎖定(Lock)、解鎖(Unlock)
鎖定分為:共享鎖定(Shared Lock)、排他鎖定(eXclusive Lock)
共享鎖定,有時也稱為,讀取鎖定。當用戶參照數據時,將對象數據變為只讀形式。
排他鎖定,也稱為,寫入鎖定 或 獨占鎖定。
在執行 INSERT、UPDATE、DELETE 等操作時,使用該鎖定。其他進程、事務,一律不能讀取、更新、寫入。
鎖定粒度:記錄(行)、表、數據庫。
鎖定提升機制:當行單位粒度的鎖定,大量產生時,數據庫將鎖定粒度自動向上提升(比如,提升成表粒度的鎖定,或者數據庫粒度的鎖定)
分離水平:事務處理之間的影響程度(同時運行時互相影響的機制)
分離水平有 4 種:
READ UNCOMMITTED :支持, 非提交讀取、不可重復讀取、幻象讀取
READ COMMITTED :支持,不可重復讀取、幻象讀取
REPEATABLE READ :支持,幻象讀取
SERIALIZABLE :都不支持
非提交讀取(髒讀 Dirty Read):能從別的事務處理中,讀取到尚未提交的更新數據,只發生在 READ UNCOMMITTED 分離水平。不推薦使用
[sql]
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
不可重復讀取(Non-Repeatable Read):某一事務處理中,由於其他事務處理的更新操作,導致,對同一數據的多次讀取,結果不同。
發生在 READ COMMITED 以下的分離水平
幻象讀取(Phantom Read):某一事務處理中,對同一數據進行多次讀取時,由於其他事務處理的插入、刪除操作,
使得結果中,出現了第一讀取時,不存在的數據,或者,第一次讀取時,存在的數據消失了,的現象。
死鎖(Dead Lock)兩個不同的事務處理,在相互等待對方釋放鎖定,永遠也不可能解除鎖定的一種狀態。
事務處理的機制,簡單的說,就是,留下更新日志。
與事務處理相關的日志,分為2個類型:UNDO 日志、 REDO 日志
UNDO 日志,又稱:回滾段(Rollback Segment)
REDO 日志,又稱:事務處理日志、或 日志。