MySQL的SQL語句 -事務性語句和鎖定語句(1)

事務性語句和鎖定語句html

START TRANSACTION、COMMIT 和 ROLLBACKmysql

1. START TRANSACTION
2.     [transaction_characteristic [, transaction_characteristic] ...]
3. 
4. transaction_characteristic: {
5.     WITH CONSISTENT SNAPSHOT
6.   | READ WRITE
7.   | READ ONLY
8. }
9. 
10. BEGIN [WORK]
11. COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
12. ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
13. SET autocommit = {0 | 1}

這些語句提供了對事務使用的控制:sql

● START TRANSACTION 或 BEGIN 啓動新事務。安全

● COMMIT 提交當前事務,使其更改永久化。服務器

● ROLLBACK 回滾當前事務,取消其更改。ide

● SET autocommit 將禁用或啓用當前會話的默認自動提交模式。函數

默認狀況下,MySQL 在自動提交模式下運行。這意味着,若是不是在事務內部,每一個語句都是原子的,就好像它被 START TRANSACTION 和 COMMIT 包圍同樣。不能使用 ROLLBACK 撤消效果;可是,若是在語句執行過程當中發生錯誤,語句將回滾。優化

要隱式禁用一系列單個語句的自動提交模式,請使用 START TRANSACTION 語句:日誌

1. START TRANSACTION;
2. SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
3. UPDATE table2 SET summary=@A WHERE type=1;
4. COMMIT;

使用 START TRANSACTION,自動提交保持禁用狀態,直到使用 COMMIT 或 ROLLBACK 結束事務。而後,自動提交模式將恢復到之前的狀態。code

START TRANSACTION 容許多個修飾符控制事務特徵。要指定多個修飾符,請用逗號分隔它們。

● WITH CONSISTENT SNAPSHOT 修飾符爲支持一致性讀取的存儲引擎啓動一致性讀取。這隻適用於 InnoDB。其效果與發出 START TRANSACTION 指令,而後從任何 InnoDB 表中執行 SELECT 同樣。WITH CONSISTENT SNAPSHOT 修飾符不會更改當前事務隔離級別,所以僅噹噹前隔離級別容許一致讀取時,它才提供一致的快照。惟一容許一致讀取的隔離級別是 REPEATABLE READ。全部其餘隔離級別,將忽略 WITH CONSISTENT SNAPSHOT 子句。忽略 WITH CONSISTENT SNAPSHOT 子句時,將生成警告。

● READ WRITE 和 READ ONLY 修飾符設置事務訪問模式。它們容許或禁止對事務中使用的表進行更改。READ ONLY 阻止事務修改或鎖定對其餘事務可見的事務表和非事務表;事務仍然能夠修改或鎖定臨時表。

當已知事務爲只讀時,MySQL 支持對 InnoDB 表的查詢進行額外優化。指定 READ ONLY 可確保在沒法自動肯定只讀狀態的狀況下應用這些優化。

若是未指定訪問模式,則應用默認模式。除非默認值已更改,不然爲讀/寫。不容許在同一語句中同時指定 READ WRITE 和 READ ONLY。

在只讀模式下,仍然可使用 DML 語句更改用 TEMPORARY 關鍵字建立的表。但不容許使用 DDL 語句進行更改。

若是啓用 read_only 系統變量,則使用 START TRANSACTION READ WRITE 顯式啓動事務須要 CONNECTION_ADMIN 權限(或不推薦使用的 SUPER 權限)。

重要

許多用於編寫 MySQL 客戶端應用程序的 API (如JDBC)提供了本身的啓動事務的方法,可使用這些方法(有時也應該),而不是從客戶端發送 START TRANSACTION 語句。

要顯式禁用自動提交模式,請使用如下語句:

1. SET autocommit=0;

經過將 autocommit 變量設置爲零來禁用自動提交模式後,對事務安全表(如 InnoDB 或 NDB 的表)的更改不會當即永久化。必須使用 COMMIT 才能將更改存儲到磁盤,或使用 ROLLBACK 放棄更改。

autocommit 是一個會話變量,必須爲每一個會話單獨設置。

BEGIN 和 BEGIN WORK 做爲 START TRANSACTION 的別名受到支持,用於啓動事務。START TRANSACTION 是標準的 SQL 語法,是啓動特定事務的推薦方法,而且容許使用 BEGIN 不支持的修飾符。

BEGIN 語句不一樣於使用 BEGIN 關鍵字來啓動 BEGIN ... END 的複合語句,後者不啓動事務。

注意

在全部存儲程序(存儲過程和函數、觸發器和事件)中,解析器將 BEGIN [WORK] 視爲 BEGIN ... END 塊的開始。在這個上下文中用 START TRANSACTION 開始事務。

COMMIT 和 ROLLBACK 支持可選的 WORK 關鍵字,CHAIN 和 RELEASE 子句也是如此。CHAIN 和 RELEASE 可用於對事務結束的額外控制。completion_type 系統變量的值決定默認結束行爲。

AND CHAIN 子句使新事務在當前事務結束時當即開始,而且新事務與剛剛終止的事務具備相同的隔離級別。新事務還使用與剛剛終止的事務相同的訪問模式(READ WRITE 或 READ ONLY)。RELEASE 子句使服務器在終止當前事務後斷開當前客戶端的會話。包含 NO 關鍵字會抑制 CHAIN 或 RELEASE 結束,若是 completion_type 系統變量默認設置爲連接或釋放結束行爲,這將很是有用。

開始一個事務會致使全部掛起的事務被提交。

開始一個事務也會使經過 LOCK TABLES 獲取的表鎖被釋放,就像執行了 UNLOCK TABLES 同樣。開始一個事務不會釋放經過 FLUSH TABLES WITH READ LOCK 得到的全局讀鎖。

爲了得到最佳結果,應該只使用由單個事務安全存儲引擎管理的表來執行事務。不然,可能會出現如下問題:

● 若是使用來自多個事務安全存儲引擎(如 InnoDB)的表,而且事務隔離級別不是 SERIALIZABLE,則當一個事務提交時,使用相同表的另外一個正在進行的事務可能只看到第一個事務所作的一些更改。也就是說,使用混合引擎不能保證事務的原子性,可能會致使數據不一致。(若是混合引擎事務不多發生,則能夠根據須要使用 SET TRANSACTION ISOLATION LEVEL 將每一個事務的隔離級別設置爲SERIALIZABLE。)

● 若是在事務中使用的表不是事務安全的,則對這些表所作的更改將當即存儲,而無論自動提交模式的狀態如何。

●若是在事務內更新非事務表後發出 ROLLBACK 語句,則會出現 ER_WARNING_NOT_COMPLETE_ROLLBACK 警告。回滾對事務安全表的更改,但不會回滾對非事務安全表的更改。

提交時,每一個事務都存儲在二進制日誌中的一個塊中。不會記錄回滾的事務。(例外:沒法回滾對非事務表的修改。若是回滾的事務包括對非事務表的修改,則整個事務將在結尾使用 ROLLBACK 語句進行記錄,以確保複製對非事務表的修改。)

可使用 SET TRANSACTION 語句更改事務的隔離級別或訪問模式。

回滾多是一個緩慢的操做,可能在用戶沒有明確請求的狀況下隱式發生(例如,當發生錯誤時)。所以,SHOW PROCESSLIST 在會話的 State 列中顯示 Rolling back,這不只用於使用 ROLLBACK 語句執行的顯式回滾,還包括隱式回滾。

注意

在 MySQL 8.0 中,BEGIN、COMMIT 和 ROLLBACK 不受 --replicate-do-db 或 --replicate-ignore-db 規則的影響。

當 InnoDB 執行事務的徹底回滾時,該事務設置的全部鎖都會被釋放。若是事務中的單個 SQL 語句因爲錯誤(如重複鍵錯誤)而回滾,則在事務保持活動狀態的同時保留由該語句設置的鎖。發生這種狀況是由於 InnoDB 以一種格式存儲行鎖,它沒法知道哪個鎖是由哪一個語句設置的。

若是事務中的 SELECT 語句調用存儲函數,而存儲函數中的語句失敗,則該語句將回滾。若是隨後對事務執行 ROLLBACK,則整個事務回滾。

官方網址:
https://dev.mysql.com/doc/refman/8.0/en/commit.html

相關文章
相關標籤/搜索