MySQL的事務陷阱和藝術,mysql事務陷阱
作者在之前的文章 “MySQL事務及為何不能在PHP模仿事務” 裡面, 詳細說明了事務的優點,並介紹了一些簡單的SQL命令,使得應用程式更加健壯。但在web程式員的生命旅程中並沒有多少事情是看起來那樣簡單的。。。。。
不能復原的語句(Statements you can’t ROLLBACK)
很遺憾滴通知你, 並不是所有的資料庫操作都支援復原( ROLLBACK ) 。如果你更改資料庫/表結構(schema), 所有當前事務都會被提交, 而升級(alteration )將會在其專屬的事務中運行(不屬於任何用戶端事務)。這些語句包括:
- CREATE DATABASE
- ALTER DATABASE
- DROP DATABASE
- CREATE TABLE
- ALTER TABLE
- DROP TABLE
- RENAME TABLE
- TRUNCATE TABLE
- CREATE INDEX
- DROP INDEX
- CREATE EVENT
- DROP EVENT
- CREATE FUNCTION
- DROP FUNCTION
- CREATE PROCEDURE
- DROP PROCEDURE
我們不能撤消資料庫根本上的變化, 例如:
START TRANSACTION; DROP TABLE MyImportantData;-- 所有事務會被強制提交, existing (empty) transaction is COMMIT-ed-- 然後該表就被永久地刪除了(table is dropped permanently)ROLLBACK;-- 沒機會了,資料已經不要你了. no chance, mate - your data's gone
提示: 暫存資料表(TEMPORARY)
建立、升級和刪除(CREATE, ALTER, and DROP)暫存資料表並不會引起隱式提交(implicit COMMIT. )。當然,這些操作也是不能復原的。
儲存點(Savepoint)
我們對異常那是愛之深責之切,那麼讓我們來看看另一個設計優美的部分。儲存點(Savepoint)是事務中有效命名位置。你可以復原到某個儲存點而不影響改點之前的SQL更新。。。有點像Photoshop中的曆史面板。
最簡單的方法,我們一起來看個樣本:
START TRANSACTION;-- 增加 tableA 的記錄INSERT INTO tableA VALUES (1,2,3);-- 建立儲存點 tableAupdatedSAVEPOINT tableAupdated;-- 增加 tableB 的記錄INSERT INTO tableB VALUES (4,5,6);-- 反正發生了些什麼不愉快的事,要取消對 tableB 所做的更新...ROLLBACK TO tableAupdated;-- 這時候提交,就只有 tableA 被更新了COMMIT;
當然, 也可以設定多個儲存點標識符(SAVEPOINT identifiers), 並且在事務中復原到任意一處。
也可以刪除一個儲存點,文法如下:
RELEASE SAVEPOINT savepointName;
只要事務提交或者(整個)復原,那麼所有的儲存點都會被刪除。
事務和儲存點的使用非常簡單,能有效保護 InnoDB 中重要的資料。你還有什麼理由堅持使用 MyISAM 呢,現在MyISAM的效率也不如InnoDB了。
注意: 想要訂閱更多資訊嗎?
你可以 訂閱 Tech Times 每周的 tech geek newsletter。
GitHub版本: https://github.com/cncounter/translation/blob/master/tiemao_2015/17_MySQL_Savepoint/MySQL_Savepoint.md
原文連結: http://www.sitepoint.com/mysql-transaction-gotchas-good-parts/
作者: 鐵錨 http://blog.csdn.net/renfufei
日期: 2015年06月29日