MySQL 如何使用事務(wù)
基礎(chǔ)知識(shí)
事務(wù)是指對一組 SQL 語句進(jìn)行一個(gè)原子化的操作,即如果這一組 SQL 語句中有一條發(fā)生錯(cuò)誤,那么其他的同組 SQL 就都不會(huì)被執(zhí)行。
你可以把它當(dāng)作一個(gè)測試,當(dāng)你執(zhí)行完一組 SQL 語句后,可以查看一下結(jié)果是否正確,如果正確后可以選擇提交,如果不正確則可以進(jìn)行回滾,恢復(fù)到原本的狀態(tài)。
在 MySQL 中,所有的操作默認(rèn)都是自動(dòng)進(jìn)行提交,當(dāng)開啟事務(wù)后則變?yōu)槭謩?dòng)提交。
基本使用
單獨(dú)開啟
單獨(dú)開啟是指對某一組的 SQL 語句開啟事務(wù)。
CREATE TABLE user( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name CHAR(12) NOT NULL, balance INT UNSIGNED ); -- 創(chuàng)建用戶表 INSERT INTO user(name,balance) VALUES ("Yunya",1000), ("Ken",500); -- 插入數(shù)據(jù) start transaction; -- 開啟事務(wù),增刪改操作均要手動(dòng)提交 UPDATE user SET balance = 500 WHERE name = "Yunya"; -- Yunya對Ken轉(zhuǎn)賬500 UPDATE user SET balance = 1000 WHERE name = "Ken"; SELECT * FROM user; -- 驗(yàn)證是否出錯(cuò) COMMIT; -- 提交事務(wù):手動(dòng)提交上面兩條UPDATE -- ROLLBACK; -- 事務(wù)回滾:轉(zhuǎn)賬金額不對時(shí)使用回滾 BEGIN -- 關(guān)閉事務(wù),增刪改操作均自動(dòng)提交
全局開啟
如果所有 SQL 都使用事務(wù)操作,我們可以通過 SET AUTOCOMMIT=0 關(guān)閉自動(dòng)提交來開啟事務(wù)機(jī)制,這樣所有語句都是事務(wù)類型。
-- 關(guān)閉自動(dòng)提交 SET AUTOCOMMIT = 0; INSERT INTO user(name,balance) VALUES ('Jack',8000); COMMIT; -- 開啟自動(dòng)提交 SET AUTOCOMMIT = 1;
事務(wù)隔離
并發(fā)問題
當(dāng)高并發(fā)訪問會(huì)遇到多個(gè)事務(wù)的隔離問題,可能會(huì)出現(xiàn)以下:
臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)
不可重復(fù)讀:事務(wù)A多次讀取同一數(shù)據(jù),事務(wù)B在事務(wù)A多次讀取的過程中,對數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果不一致。
幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。
不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
隔離級(jí)別
系統(tǒng)默認(rèn)隔離級(jí)別為3級(jí),可能出現(xiàn)幻讀的情況。
隔離級(jí)別 | 中文釋義 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 說明 |
---|---|---|---|---|---|
read uncommitted | 讀未提交 | 是 | 是 | 是 | 最低的事務(wù)隔離級(jí)別,一個(gè)事務(wù)還沒提交時(shí),它做的變更就能被別的事務(wù)看到 |
read committed | 不可重復(fù)讀 | 否 | 是 | 是 | 保證一個(gè)事物提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事物未提交的數(shù)據(jù) |
repeatable read | 可重復(fù)讀 | 否 | 否 | 是 | 多次讀取同一范圍的數(shù)據(jù)會(huì)返回第一次查詢的快照,即使其他事務(wù)對該數(shù)據(jù)做了更新修改。事務(wù)在執(zhí)行期間看到的數(shù)據(jù)前后必須是一致的 |
serializable | 串行化 | 否 | 否 | 否 | 事務(wù) 100% 隔離,可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生?;ㄙM(fèi)最高代價(jià)但最可靠的事務(wù)隔離級(jí)別 |
查詢設(shè)置
查詢隔離級(jí)別
select @@tx_isolation;
設(shè)置隔離級(jí)別
set session transaction isolation level read uncommitted; -- set session只對當(dāng)前會(huì)話有效,set global則對全局有效
以上就是MySQL 如何使用事務(wù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 事務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle與MySQL的區(qū)別及優(yōu)缺點(diǎn)
這篇文章主要介紹了Oracle與MySQL的區(qū)別及優(yōu)缺點(diǎn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參加一下2022-08-08MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵
主鍵是用于唯一標(biāo)識(shí)數(shù)據(jù)庫表中每一行數(shù)據(jù)的一列或一組列,主鍵可以確保數(shù)據(jù)的唯一性和完整性,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫如何正確設(shè)置主鍵的相關(guān)資料,需要的朋友可以參考下2024-04-04Tableau連接mysql數(shù)據(jù)庫的實(shí)現(xiàn)步驟
本文主要介紹了Tableau連接mysql數(shù)據(jù)庫的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01詳解MySQL存儲(chǔ)過程的創(chuàng)建和調(diào)用
這篇文章主要為大家介紹了MySQL存儲(chǔ)過程的創(chuàng)建和調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12Mysql數(shù)據(jù)表中的蠕蟲復(fù)制使用方法
在本文中我們給大家分享了關(guān)于怎么使用Mysql數(shù)據(jù)表中的蠕蟲復(fù)制的相關(guān)知識(shí)點(diǎn),有興趣的朋友們學(xué)習(xí)下。2019-02-02