MySQL入門--事務控制語句

panpong發表於2019-05-28

事務 SQL 控制語句

MySQL 事務遵從 ACID

Atomic (原子性):所有語句作為一個單元全部成功執行或全部取消。

Consistent (一致性):如果資料庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致狀態。

Isolated (隔離性):事務之間不相互影響。

Durable (永續性):事務成功完成後,所做的所有更改都會準確地記錄在資料庫中。所做的更改不會丟失

1) 事務 SQL 控制語句

START TRANSACTION (或 BEGIN ):顯式開始一個新事務

SAVEPOINT :分配事務過程中的一個位置,以供將來引用

COMMIT :永久記錄當前事務所做的更改

ROLLBACK :取消當前事務所做的更改

ROLLBACK TO SAVEPOINT :取消在 savepoint 之後執行的更改

RELEASE SAVEPOINT :刪除 savepoint 識別符號

SET AUTOCOMMIT :為當前連線禁用或啟用預設 autocommit 模式

2) AUTOCOMMIT 模式

如何設定 AUTOCOMMIT 模式決定了如何以及何時開始新事務。預設情況下, AUTOCOMMIT 處於全域性啟用狀態,這意味著會強制每個 SQL 語句隱式開始一個新事務。可以透過一個選項檔案全域性禁用 AUTOCOMMIT ,也可以透過設定 autocommit 變數為每個會話禁用它。啟用 AUTOCOMMIT 會限制每個語句,並進而影響其自身事務中的事務表。這樣可以有效地防止在一個事務中執行多個語句。這意味著,您將無法透過 COMMIT ROLLBACK 作為一個單元提交或回滾多個語句。有時,會將這種情況誤認為根本沒有事務。但是,情況並非如此。啟用 AUTOCOMMIT 後,每個語句仍會以原子方式執行。例如,透過在插入多個行時比較違反約束限制的效果,便可看出啟用 AUTOCOMMIT 和根本不具有事務之間的差別。在非事務表(如 MyISAM )中,一旦發生錯誤,語句就會終止,已經插入的行會保留在該表中。而對於 InnoDB 表,已經插入的所有行都會從該表中刪除,從而不會產生任何實際影響。

AUTOCOMMIT 確定開始新事務的方式和時間;預設情況下, AUTOCOMMIT 模式處於啟用狀態:作為一個事務隱式提交每個語句;

my.cnf 中將 AUTOCOMMIT 模式設定為 0 ,或者 SET GLOBAL AUTOCOMMIT=0;SET SESSION AUTOCOMMIT=0; SET @@AUTOCOMMIT :=0; 則禁用 AUTOCOMMIT ,事務會跨越多個語句,需要使用 COMMIT ROLLBACK 結束事務;

使用 SELECT 檢查 AUTOCOMMIT 設定:

SELECT @@AUTOCOMMIT;

3) 隱式提交

COMMIT 語句始終會 顯式提交 當前事務。其他事務控制語句(例如,本幻燈片列出的語句)還具有隱式提交當前事務的作用。除了這些事務控制語句之外,其他型別的語句可能也具有隱式提交併進而終止)當前事務的作用。這些語句的行為就像在執行實際語句之前發出 COMMIT 一樣。此外,這些語句本身並非事務語句,也就是說,如果成功,則無法回滾。通常,資料定義語句、據訪問和使用者管理語句以及鎖定語句具有這種效果。

注:有很多例外情況,而且這些語句並非都能在所有版本的伺服器上導致隱式提交。但是,建議將所有非 DML 語句都視為可導致隱式提交。有關導致隱式提交的完整語句列表,請參閱《 MySQL 參考手冊》: http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

隱式提交 會終止當前事務。用於隱式提交的 SQL 語句:

l   START TRANSACTION

l   SET AUTOCOMMIT = 1

導致提交的非事務語句:

l   資料定義語句( ALTER CREATE DROP

l   管理語句( GRANT REVOKE SET PASSWORD

l   鎖定語句( LOCK TABLES UNLOCK TABLES

導致隱式提交的語句示例:

Mysql>TRUNCATE TABLE

Mysql>LOAD DATA INFILE

4) 事務儲存引擎

使用 SHOW ENGINES 列出引擎特徵:

mysql> SHOW ENGINES\G

********************* 2. row *********************

Engine: InnoDB

Support: DEFAULT

Comment: Supports transactions, row-level locking,

and foreign keys

Transactions: YES

XA: YES

Savepoints: YES

********************* 1. row *********************

Engine: MyISAM

Support: YES

Comment: MyISAM storage engine

Transactions: NO

XA: NO

Savepoints: NO

...

要確保事務儲存引擎已編譯到 MySQL 伺服器中,並且可以在執行時使用,可使用 SHOW ENGINES 語句。 Support 列中的值為 YES NO ,用於指示該引擎是否可以使用。如果該值為 DISABLED 則表示該引擎存在,但已關閉。值 DEFAULT 用於指示伺服器在預設情況下使用的儲存引擎。指定為 DEFAULT 的引擎應視為可用。 Transactions XA Savepoints 列用於指示該儲存引擎是否支援這些功能。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16976507/viewspace-2645832/,如需轉載,請註明出處,否則將追究法律責任。

相關文章