注意:并非所有的MySQL資料庫引擎都支援事務處理,MyISAM引擎不支援明确的事務處理管理,InnoDB引擎支援事務處理管理,如果應用中需要事務處理功能,一定要選用正确的引擎。
事務處理
事務處理可以用來維護資料庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼完全不執行。
一般來說,事務是必須滿足4個條件: Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
管理事務處理的關鍵在于将SQL語句組分解為邏輯快,并明确規定資料何時應該回退,何時不應該回退。
事務進行中經常用到的幾個術語:
1、事務:指一組SQL語句。
2、回退:指撤銷指定SQL語句的過程。
3、送出:指将未存儲的SQL語句結果寫入資料庫表。
4、保留點:指事務進行中設定的臨時占位符,可以對它釋出回退(這裡的回退與回退整個事務處理不同)。
辨別事務的開始
START TRANSACTION;
ROLLBACK 回退、撤銷操作
ROLLBACK指令用來回退、撤銷MySQL語句。ROLLBACK語句隻能在一個事務進行中使用,即在執行一條START TRANSACTION語句到ROLLBACK語句之間的所有SQL語句。事務處理用來管理INSERT、UPDATE、DELETE語句。
注意:不能回退SELECT 語句(因為回退SELECT語句也沒有什麼實際意義),同時也不能回退CREATE、DROP操作(事務處理塊中可以使用CREATE、DROP操作,但如果執行回退,它們不會被撤銷)。
文法:
START TRANSACTION;//事務的開始
DELETE、UPDATE、INSERT語句;
ROLLBACK;//事務復原
COMMIT送出操作
隐含送出:一般的MySQL語句都是直接針對資料庫表執行和編寫的,這就是隐含送出,即送出(寫或儲存)操作是自動進行的。
在事務處理塊中,送出不會隐含地進行,為進行明确的送出,必須使用COMMIT語句。
注意:當COMMIT或ROLLBACK語句執行後,事務會自動關閉(将來的更改會隐含送出)。
文法:
COMMIT;
例如:
SELECT * FROM city;
START TRANSACTION;//事務開始
DELETE FROM WHERE id = 1001;
COMMIT;//送出事務操作
使用保留點
建立保留點使用SAVEPOINT語句,每個保留點都必須是辨別它的唯一名字,以便在回退時MySQL知道要回退到何處,文法:
SAVEPOINT 保留點名稱;
回退保留點使用ROLLBACK TO語句,在使用回退保留點語句時必須指明它的保留點名稱,否則無法回退,文法:
ROLLBACK TO 保留點名稱;
注意:保留點在事務處理完成後會自動釋放(執行一條ROLLBACK或COMMIT語句後會自動釋放),從MySQL5開始,也可以明确的釋放保留點,文法:
RELEASE SAVEPOINT 保留點名稱;
建議:個人認為保留點越多越好,這樣可以按照自己的意願靈活的進行回退。
更改預設的送出行為
MySQL預設的是自動送出所有更改,大部分情況下執行一條MySQL語句時該語句實際上都是針對表執行的,而且所做的更改立即生效。
可以訓示MySQL不自動送出更改,語句:
SET autocommit = 0;
設定值為 0(假) 表示MySQL不自動送出更改
設定值為 1(真) 表示MySQL自動送出更改