主頁 > 知識庫 > MySQL 如何使用事務(wù)

MySQL 如何使用事務(wù)

熱門標(biāo)簽:廣東400企業(yè)電話申請流程 新鄉(xiāng)智能外呼系統(tǒng)好處 宜賓全自動外呼系統(tǒng)廠家 許昌外呼增值業(yè)務(wù)線路 咸陽防封電銷卡 申請400電話電話價(jià)格 臨沂做地圖標(biāo)注 地圖標(biāo)注客戶付款 石家莊400電話辦理公司

基礎(chǔ)知識

事務(wù)是指對一組 SQL 語句進(jìn)行一個原子化的操作,即如果這一組 SQL 語句中有一條發(fā)生錯誤,那么其他的同組 SQL 就都不會被執(zhí)行。

你可以把它當(dāng)作一個測試,當(dāng)你執(zhí)行完一組 SQL 語句后,可以查看一下結(jié)果是否正確,如果正確后可以選擇提交,如果不正確則可以進(jìn)行回滾,恢復(fù)到原本的狀態(tài)。

在 MySQL 中,所有的操作默認(rèn)都是自動進(jìn)行提交,當(dāng)開啟事務(wù)后則變?yōu)槭謩犹峤弧?/p>

基本使用

單獨(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ù),增刪改操作均要手動提交

  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)證是否出錯

  COMMIT; -- 提交事務(wù):手動提交上面兩條UPDATE
  -- ROLLBACK; -- 事務(wù)回滾:轉(zhuǎn)賬金額不對時(shí)使用回滾

BEGIN -- 關(guān)閉事務(wù),增刪改操作均自動提交

全局開啟

如果所有 SQL 都使用事務(wù)操作,我們可以通過 SET AUTOCOMMIT=0 關(guān)閉自動提交來開啟事務(wù)機(jī)制,這樣所有語句都是事務(wù)類型。

-- 關(guān)閉自動提交
SET AUTOCOMMIT = 0;

INSERT INTO user(name,balance) VALUES
	('Jack',8000);
	
COMMIT;

-- 開啟自動提交
SET AUTOCOMMIT = 1;

事務(wù)隔離

并發(fā)問題

當(dāng)高并發(fā)訪問會遇到多個事務(wù)的隔離問題,可能會出現(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等級,但是系統(tǒng)管理員B就在這個時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。
不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

隔離級別

系統(tǒng)默認(rèn)隔離級別為3級,可能出現(xiàn)幻讀的情況。

隔離級別 中文釋義 臟讀 不可重復(fù)讀 幻讀 說明
read uncommitted 讀未提交 最低的事務(wù)隔離級別,一個事務(wù)還沒提交時(shí),它做的變更就能被別的事務(wù)看到
read committed 不可重復(fù)讀 保證一個事物提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事物未提交的數(shù)據(jù)
repeatable read 可重復(fù)讀 多次讀取同一范圍的數(shù)據(jù)會返回第一次查詢的快照,即使其他事務(wù)對該數(shù)據(jù)做了更新修改。事務(wù)在執(zhí)行期間看到的數(shù)據(jù)前后必須是一致的
serializable 串行化 事務(wù) 100% 隔離,可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。花費(fèi)最高代價(jià)但最可靠的事務(wù)隔離級別

查詢設(shè)置

查詢隔離級別

select @@tx_isolation;

設(shè)置隔離級別

set session transaction isolation level read uncommitted; -- set session只對當(dāng)前會話有效,set global則對全局有效

以上就是MySQL 如何使用事務(wù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 事務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 深入理解PHP+Mysql分布式事務(wù)與解決方案
  • 淺析MySQL 鎖和事務(wù)
  • 聊聊MySQL事務(wù)的特性和隔離級別
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID
  • MySQL為什么要避免大事務(wù)以及大事務(wù)解決的方法
  • Mysql事務(wù)隔離級別原理實(shí)例解析
  • MySQL查看和修改事務(wù)隔離級別的實(shí)例講解
  • Mysql事務(wù)特性和級別原理解析

標(biāo)簽:北京 臺灣 合肥 貴州 鷹潭 鎮(zhèn)江 日照 阜新

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 如何使用事務(wù)》,本文關(guān)鍵詞  MySQL,如何,使用,事務(wù),MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 如何使用事務(wù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL 如何使用事務(wù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章