一文帶你理解MySQL?TCL?事務(wù)控制
MySQL 中并非所有的數(shù)據(jù)庫存儲引擎都支持事務(wù)操作,比如 MyISAM 就不支持。所以,使用事務(wù)處理的時候一定要確定所操作的表示是否支持事務(wù)處理,可以通過查看建表語句來查看有沒有指定事務(wù)類型的存儲引擎。當(dāng)然,事務(wù)處理是為了保障表數(shù)據(jù)原子性、一致性、隔離性、持久性。這些都需要消耗系統(tǒng)資源,請謹(jǐn)慎選擇。
本文以數(shù)據(jù)庫引擎 InnoDB 為例演示命令行模式下事務(wù)的基本操作。
1.隔離級別查看與設(shè)置
(1)查看全局和當(dāng)前會話的事務(wù)隔離級別。
-- 查看全局 SELECT @@global.transaction_isolation; -- 查看當(dāng)前會話 SELECT @@transaction_isolation; SELECT @@session.transaction_isolation; SHOW VARIABLES LIKE 'transaction_isolation';
從 MySQL 8.0 起,tx_isolation 變量被 transaction_isolation 變量替換了,所以請使用最新的變量 transaction_isolation。
MySQL InnoDB 缺省隔離級別是可重復(fù)讀(Repeatable Read)。
(2)更改事務(wù)的隔離級別。
MySQL 提供了 SET TRANSACTION 語句,該語句可以改變單個會話或全局的事務(wù)隔離級別。
SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic: {
ISOLATION LEVEL level
| access_mode
}
level: {
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
access_mode: {
READ WRITE
| READ ONLY
}
不顯示指明 SESSION 或 GLOBAL,默認(rèn)是 SESSION,即設(shè)置當(dāng)前會話的事務(wù)隔離級別。如果使用 GLOBAL 關(guān)鍵字,為之后的所有新連接設(shè)置事務(wù)隔離級別,需要 SUPER 權(quán)限來做這個。
比如更改事務(wù)隔離級別為讀已提交。
-- 更改當(dāng)前會話事務(wù)隔離級別(可省略 SESSION) SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 更改全局事務(wù)隔離級別 SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
也可以直接使用 SET 語句為變更系統(tǒng)變量 transaction_isolation 的值修改當(dāng)前 session 的事務(wù)隔離級別。
SET @@transaction_isolation='READ-COMMITTED';
或者設(shè)置全局事務(wù)隔離級別為讀已提交。
SET @@global.transaction_isolation='READ-COMMITTED';
2.自動提交事務(wù)
2.1 查看是否自動提交事務(wù)
MySQL 默認(rèn)事務(wù)操作模式是自動提交模式(autocommit )。
系統(tǒng)變量 @@autocommit 用來控制一條SQL語句提交后是否自動執(zhí)行,默認(rèn)值是1,表示在命令行模式下每條增刪改語句在鍵入回車后,都會立即生效,而不需要手動 commit。我們可以把它關(guān)閉,關(guān)閉之后需要 commit,SQL 語句才會真正生效。
由于系統(tǒng)變量 autocommit 分為會話系統(tǒng)變量與全局系統(tǒng)變量,所以查詢的時候,最好區(qū)別一下。
查看當(dāng)前會話是否處于自動提交模式。
SELECT @@autocommit; SELECT @@session.autocommit; SHOW SESSION VARIABLES LIKE 'autocommit';
如果返回結(jié)果為 1 或 ON,則表示當(dāng)前會話處于自動提交模式;如果返回結(jié)果為 0 或 OFF,則表示當(dāng)前會話未處于自動提交模式。
如果想查看全局配置,可查看系統(tǒng)變量 @@global.autocommit。
SELECT @@global.autocommit; SHOW GLOBAL VARIABLES LIKE 'autocommit';
2.2 關(guān)閉或開啟自動提交事務(wù)
- 關(guān)閉自動提交事務(wù)。
MySQL默認(rèn)自動提交事務(wù),即除非顯式的開啟事務(wù)(BEGIN 或 START TRANSACTION),否則每條 SOL 語句都會被當(dāng)做一個單獨(dú)的事務(wù)自動執(zhí)行。但有些情況下,我們需要關(guān)閉事務(wù)自動提交來保證數(shù)據(jù)的一致性。
關(guān)閉自動提交事務(wù)主要有兩種方法。一種是臨時關(guān)閉,只對當(dāng)前會話有效。第二種是永久關(guān)閉,對所有會話有效。
第一種:臨時關(guān)閉。
關(guān)閉當(dāng)前會話的自動提交事務(wù)。
SET autocommit = 0; SET @@autocommit = 0; SET @@session.autocommit = 0; SET SESSION autocommit = 0;
這樣之后,所有增刪改語句,都必須使用 commit 之后,才能生效。
第二種:永久關(guān)閉。
在 MySQL 中,要永久地關(guān)閉自動提交事務(wù),必須在配置文件中進(jìn)行設(shè)置,以便在每次啟動 MySQL 服務(wù)器時都保持這個設(shè)置。
找到 MySQL 的配置文件。在大多數(shù)情況下,MySQL 的配置文件名為 my.cnf 或 my.ini,具體位置取決于您的操作系統(tǒng)和安裝方式。
打開配置文件并找到 [mysqld] 部分,添加或修改下面的配置項。
[mysqld] init_connect='SET autocommit=0'
保存,然后重新啟動 MySQL 服務(wù)器即可生效。
- 開啟自動提交事務(wù)。
如果需要,可以開啟自動提交模式。
SET autocommit = 1; SET @@autocommit = 1; SET @@session.autocommit = 1; SET SESSION autocommit = 1;
要想永久有效,需要將上面配置文件中的配置項init_connect='SET autocommit=0'刪除或設(shè)置為 1。
3.事務(wù)執(zhí)行基本流程
首先創(chuàng)建一個測試數(shù)據(jù)表,建表語句如下:
CREATE TABLE transaction_test(id int primary key)engine=InnoDB;
- 開啟一個事務(wù)。
BEGIN; # 或 START TRANSACTION;
- 執(zhí)行一系列增刪改語句。
INSERT INTO transaction_test VALUES(1);
- 手動提交或回滾。
事務(wù)回滾:
ROLLBACK;
回滾后我們查看數(shù)據(jù)表中的數(shù)據(jù)。
SELECT * FROM transaction_test; Empty set (0.00 sec)
表中沒有數(shù)據(jù),回滾成功。
手動提交事務(wù):
COMMIT;
提交后,再 ROLLBACK 則不能回滾了,數(shù)據(jù)已經(jīng)插入到數(shù)據(jù)表了。這里需要注意的是,在當(dāng)前會話中,我們還沒有手動 COMMIT 提交事務(wù)的時候,表中的數(shù)據(jù)已經(jīng)被插入了,但對于其它會話,如果事務(wù)隔離級別是 READ COMMITED,那么在 COMMIT 之前,查詢不到新插入的記錄。
4.設(shè)置事務(wù)的保存點(diǎn)
在 MySQL 中,您可以使用事務(wù)保存點(diǎn)(Savepoint)來標(biāo)記事務(wù)中的一個特定位置,以便在事務(wù)進(jìn)行過程中進(jìn)行部分回滾。事務(wù)保存點(diǎn)可以在事務(wù)內(nèi)部創(chuàng)建,并且可以用于回滾到該保存點(diǎn)之前的狀態(tài),而不影響事務(wù)中的其他操作。
- 設(shè)置折返點(diǎn)
SAVEPOINT identifier;
- 回滾至折返點(diǎn)
ROLLBACK [WORK] TO [SAVEPOINT] identifier;
這將撤銷從保存點(diǎn)創(chuàng)建后到當(dāng)前位置之間的所有操作。
- 提交或繼續(xù)事務(wù)。
如果您滿意回滾后的狀態(tài),可以繼續(xù)進(jìn)行其他操作,并最終提交事務(wù)。
COMMIT; -- 提交事務(wù)
通過使用事務(wù)保存點(diǎn),您可以更細(xì)粒度地控制事務(wù)的回滾操作,以適應(yīng)復(fù)雜的業(yè)務(wù)需求。請注意,保存點(diǎn)只在當(dāng)前事務(wù)內(nèi)部有效,并且一旦事務(wù)提交或回滾,保存點(diǎn)將被清除。
參考文獻(xiàn)
13.3 Transactional and Locking Statements
MySQL 8.0 Reference Manual :: MySQL Glossary
15.7.2.1 Transaction Isolation Levels - MySQL
13.3.7 SET TRANSACTION Statement
MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables
到此這篇關(guān)于一文帶你理解MySQL TCL 事務(wù)控制的文章就介紹到這了,更多相關(guān)MySQL TCL 事務(wù)控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 查詢當(dāng)天、本周,本月,上一個月的數(shù)據(jù)
這篇文章主要介紹了mysql 查詢當(dāng)天、本周,本月,上一個月的數(shù)據(jù)的sql代碼,在文中還給大家提到了mysql如何查詢當(dāng)天信息,具體內(nèi)容詳情大家參考下本文2018-01-01
利用Shell腳本實(shí)現(xiàn)遠(yuǎn)程MySQL自動查詢
本篇文章是對利用Shell腳本實(shí)現(xiàn)遠(yuǎn)程MySQL自動查詢的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
深入解析mysql中order by與group by的順序問題
本篇文章是對mysql中order by與group by的順序問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Mysql數(shù)據(jù)庫之Binlog日志使用總結(jié)(必看篇)
下面小編就為大家?guī)硪黄狹ysql數(shù)據(jù)庫之Binlog日志使用總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
mysql更新一個表里的字段等于另一個表某字段的值實(shí)例
下面小編就為大家?guī)硪黄猰ysql更新一個表里的字段等于另一個表某字段的值實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
mysql中Table is read only的解決方法小結(jié)
本文章總結(jié)了關(guān)于在linux與windows中 mysql出現(xiàn)Table is read only解決辦法總結(jié),有需要的朋友可參考一下2013-01-01

