系統(tǒng)講解MySQL數(shù)據(jù)庫(kù)中事務(wù)的核心機(jī)制與應(yīng)用實(shí)踐
在數(shù)據(jù)庫(kù)開(kāi)發(fā)中,事務(wù)是保障數(shù)據(jù)安全的核心機(jī)制。無(wú)論是電商下單、銀行轉(zhuǎn)賬還是火車票售票,一旦涉及多步數(shù)據(jù)操作,若不加控制,就會(huì)出現(xiàn)數(shù)據(jù)不一致、超賣、重復(fù)扣款等嚴(yán)重問(wèn)題。本文將從實(shí)際問(wèn)題出發(fā),系統(tǒng)拆解 MySQL 事務(wù)的核心概念、ACID 特性、隔離級(jí)別、底層實(shí)現(xiàn)(MVCC)及實(shí)戰(zhàn)操作,幫你徹底搞懂事務(wù)的底層邏輯與使用規(guī)范。
一、為什么需要事務(wù)?從一個(gè)超賣案例說(shuō)起
先看經(jīng)典的火車票售票系統(tǒng)超賣問(wèn)題,這是無(wú)事務(wù)場(chǎng)景下的典型數(shù)據(jù)錯(cuò)亂案例。
1.1 場(chǎng)景模擬
有一張火車票表tickets,僅剩 1 張西安 <-> 蘭州的車票:
| id | name | nums |
|---|---|---|
| 10 | 西安 <-> 蘭州 | 1 |
此時(shí)客戶端 A和客戶端 B同時(shí)發(fā)起購(gòu)票請(qǐng)求,偽代碼邏輯如下:
// 客戶端A
if (nums > 0) { // 檢查有票
賣票();
update tickets set nums = nums - 1; // 更新票數(shù)
}
// 客戶端B
if (nums > 0) { // 同時(shí)檢查有票(此時(shí)A還沒(méi)更新數(shù)據(jù)庫(kù))
賣票();
update tickets set nums = nums - 1; // 再次更新票數(shù)
}1.2 問(wèn)題結(jié)果
- 客戶端 A 檢查到票數(shù) = 1,準(zhǔn)備賣票,但還沒(méi)執(zhí)行 update 更新數(shù)據(jù)庫(kù);
- 客戶端 B 同時(shí)檢查,發(fā)現(xiàn)票數(shù)仍 = 1,也執(zhí)行賣票;
- 最終 A、B 都執(zhí)行
update,票數(shù)從 1 變成 - 1,同一張票被賣了兩次,出現(xiàn)超賣。
1.3 解決方案:事務(wù)的四大核心訴求
要解決上述問(wèn)題,買票操作必須滿足 4 個(gè)核心屬性,這正是事務(wù)的設(shè)計(jì)初衷:
- 原子性:買票的檢查 + 更新操作,要么全部成功,要么全部失敗,不能只執(zhí)行一半;
- 一致性:買票前后,數(shù)據(jù)庫(kù)票數(shù)始終合法(不能為負(fù)、不能超賣);
- 隔離性:多個(gè)客戶端買票時(shí),操作互相隔離,互不干擾;
- 持久性:買票成功后,即使服務(wù)器宕機(jī),數(shù)據(jù)也不會(huì)丟失。
二、事務(wù)的基本概念與核心特性(ACID)
2.1 什么是事務(wù)?
事務(wù)是一組邏輯相關(guān)的 DML 語(yǔ)句集合(增刪改查),這些語(yǔ)句在邏輯上是一個(gè)整體,要么全部執(zhí)行成功,要么全部執(zhí)行失敗,不存在 “部分成功、部分失敗” 的中間狀態(tài)。
簡(jiǎn)單說(shuō),事務(wù)就是 “要么全做,要么全不做” 的不可分割工作單元。例如:
- 銀行轉(zhuǎn)賬:A 扣錢、B 加錢,必須同時(shí)成功或同時(shí)失??;
- 電商下單:扣庫(kù)存、生成訂單、扣余額,必須作為一個(gè)整體執(zhí)行。
2.2 事務(wù)的四大核心特性(ACID)
事務(wù)必須滿足原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability) 四大特性,簡(jiǎn)稱 ACID,這是事務(wù)的核心準(zhǔn)則。
1. 原子性(Atomicity):不可分割,要么全成要么全敗
- 定義:一個(gè)事務(wù)中的所有操作,是一個(gè)不可分割的原子,要么全部執(zhí)行成功,要么全部回滾到事務(wù)開(kāi)始前的狀態(tài),不會(huì)停留在中間環(huán)節(jié)。
- 底層保障:通過(guò)Undo Log(回滾日志) 實(shí)現(xiàn)。事務(wù)執(zhí)行前,會(huì)把數(shù)據(jù)修改前的狀態(tài)記錄到 Undo Log;若事務(wù)執(zhí)行失敗或崩潰,MySQL 會(huì)利用 Undo Log 將數(shù)據(jù)恢復(fù)到事務(wù)開(kāi)始前的狀態(tài)。
- 案例:轉(zhuǎn)賬時(shí),A 扣了 100 元但 B 沒(méi)加錢,事務(wù)會(huì)回滾,A 的 100 元自動(dòng)恢復(fù),避免數(shù)據(jù)丟失。
2. 一致性(Consistency):數(shù)據(jù)合法,狀態(tài)一致
定義:事務(wù)執(zhí)行前后,數(shù)據(jù)庫(kù)的完整性約束不被破壞,數(shù)據(jù)從一個(gè)合法狀態(tài)轉(zhuǎn)移到另一個(gè)合法狀態(tài),不會(huì)出現(xiàn)非法數(shù)據(jù)。
核心要點(diǎn):
- 數(shù)據(jù)必須符合預(yù)設(shè)規(guī)則(主鍵唯一、外鍵關(guān)聯(lián)、非空、余額非負(fù)等);
- 一致性由原子性、隔離性、持久性共同保障,同時(shí)依賴業(yè)務(wù)邏輯(如余額不能為負(fù))。
案例:火車票售票,無(wú)論賣多少次,票數(shù)不能為負(fù);轉(zhuǎn)賬前后,A 和 B 的總余額始終不變。
3. 隔離性(Isolation):并發(fā)隔離,互不干擾
- 定義:多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),互相隔離、互不干擾,一個(gè)事務(wù)的操作在未提交前,對(duì)其他事務(wù)不可見(jiàn),避免并發(fā)導(dǎo)致的數(shù)據(jù)錯(cuò)亂。
- 核心作用:解決高并發(fā)下的臟讀、不可重復(fù)讀、幻讀問(wèn)題(后文詳細(xì)講解)。
- 底層保障:通過(guò)鎖機(jī)制和MVCC(多版本并發(fā)控制) 實(shí)現(xiàn),不同隔離級(jí)別對(duì)應(yīng)不同的鎖策略。
4. 持久性(Durability):提交即永久,宕機(jī)不丟失
- 定義:事務(wù)一旦提交(COMMIT),對(duì)數(shù)據(jù)的修改就是永久生效的,即使服務(wù)器斷電、宕機(jī),數(shù)據(jù)也不會(huì)丟失。
- 底層保障:通過(guò)Redo Log(重做日志) 實(shí)現(xiàn)。事務(wù)提交時(shí),先把修改記錄寫入 Redo Log,再異步刷到磁盤;若崩潰,重啟后通過(guò) Redo Log 恢復(fù)數(shù)據(jù)。
2.3 事務(wù)的引擎支持:僅 InnoDB 支持事務(wù)
MySQL 中,只有 InnoDB 引擎支持事務(wù),MyISAM、MEMORY 等引擎不支持事務(wù),這也是 InnoDB 成為 MySQL 默認(rèn)引擎的核心原因。
查看數(shù)據(jù)庫(kù)引擎及事務(wù)支持情況:
-- 查看所有引擎 show engines; -- 行格式顯示,重點(diǎn)看Transactions字段(YES=支持,NO=不支持) show engines \G;
關(guān)鍵結(jié)果:
- InnoDB:Transactions=YES(支持事務(wù)、行鎖、外鍵);
- MyISAM:Transactions=NO(不支持事務(wù))。
三、事務(wù)的提交方式與基礎(chǔ)操作
3.1 事務(wù)的兩種提交方式
MySQL 事務(wù)默認(rèn)自動(dòng)提交,也可手動(dòng)控制提交 / 回滾,兩種方式:
1. 自動(dòng)提交(默認(rèn))
規(guī)則:每條 SQL 語(yǔ)句都是一個(gè)獨(dú)立事務(wù),執(zhí)行后自動(dòng)提交,無(wú)法回滾;
查看狀態(tài):
show variables like 'autocommit'; -- 默認(rèn)ON(開(kāi)啟)
關(guān)閉自動(dòng)提交:
set autocommit=0; -- OFF(關(guān)閉),需手動(dòng)commit/rollback
2. 手動(dòng)提交(顯式事務(wù))
- 規(guī)則:通過(guò)
BEGIN/START TRANSACTION顯式開(kāi)啟事務(wù),執(zhí)行 SQL 后,手動(dòng) COMMIT 提交(永久生效)或 ROLLBACK 回滾(撤銷操作)。 - 核心命令:
-- 1. 開(kāi)啟事務(wù)(二選一,推薦BEGIN) BEGIN; START TRANSACTION; -- 2. 執(zhí)行DML操作(增刪改) insert into account values (1, '張三', 100); update account set blance=200 where id=1; -- 3. 提交事務(wù)(永久生效,不可回滾) COMMIT; -- 4. 回滾事務(wù)(撤銷所有未提交操作,恢復(fù)到事務(wù)開(kāi)始前) ROLLBACK;
3.2 事務(wù)保存點(diǎn)(SAVEPOINT):部分回滾
事務(wù)支持保存點(diǎn),可在事務(wù)中設(shè)置多個(gè)保存點(diǎn),回滾時(shí)可指定回滾到某個(gè)保存點(diǎn),無(wú)需回滾整個(gè)事務(wù)。
示例:保存點(diǎn)的創(chuàng)建與回滾
-- 1. 開(kāi)啟事務(wù) BEGIN; -- 2. 創(chuàng)建保存點(diǎn)save1 SAVEPOINT save1; insert into account values (1, '張三', 100); -- 3. 創(chuàng)建保存點(diǎn)save2 SAVEPOINT save2; insert into account values (2, '李四', 10000); -- 4. 回滾到save2(僅撤銷李四的插入,張三的數(shù)據(jù)保留) ROLLBACK TO save2; -- 5. 提交事務(wù)(最終僅張三的數(shù)據(jù)生效) COMMIT;
3.3 事務(wù)操作核心結(jié)論
- 執(zhí)行
BEGIN/START TRANSACTION后,事務(wù)必須通過(guò)COMMIT提交才會(huì)持久化,與autocommit無(wú)關(guān); - 事務(wù)未提交時(shí),客戶端崩潰,MySQL 會(huì)自動(dòng)回滾所有未提交操作;
- 事務(wù)提交后,客戶端崩潰,數(shù)據(jù)不會(huì)丟失,已持久化到數(shù)據(jù)庫(kù);
- 單條 SQL 在
autocommit=ON時(shí),自動(dòng)封裝為獨(dú)立事務(wù),執(zhí)行后永久生效。
四、事務(wù)隔離級(jí)別:平衡一致性與并發(fā)性能
4.1 并發(fā)事務(wù)的三大問(wèn)題
多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),若隔離性不足,會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀三大問(wèn)題,嚴(yán)重影響數(shù)據(jù)一致性。
1. 臟讀(Dirty Read)
- 定義:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)未提交的修改數(shù)據(jù),后續(xù)該事務(wù)回滾,導(dǎo)致讀取的數(shù)據(jù)無(wú)效。
- 案例:
- 事務(wù) A:更新張三余額為 123,未提交;
- 事務(wù) B:讀取張三余額 = 123(臟讀);
- 事務(wù) A:回滾,張三余額恢復(fù)為 100;
- 結(jié)果:事務(wù) B 讀取到無(wú)效數(shù)據(jù)。
2. 不可重復(fù)讀(Non-Repeatable Read)
- 定義:同一個(gè)事務(wù)內(nèi),多次讀取同一數(shù)據(jù),結(jié)果不一致(因其他事務(wù)中途提交修改)。
- 案例:
- 事務(wù) B:第一次讀取張三余額 = 123;
- 事務(wù) A:更新張三余額為 321,提交;
- 事務(wù) B:第二次讀取張三余額 = 321;
- 結(jié)果:同一事務(wù)內(nèi),兩次讀取結(jié)果不同。
3. 幻讀(Phantom Read)
- 定義:同一個(gè)事務(wù)內(nèi),多次查詢同一條件的數(shù)據(jù),記錄數(shù)不一致(因其他事務(wù)中途插入 / 刪除數(shù)據(jù))。
- 案例:
- 事務(wù) B:第一次查詢 account 表,有 2 條記錄;
- 事務(wù) A:插入一條新記錄(王五),提交;
- 事務(wù) B:第二次查詢 account 表,有 3 條記錄;
- 結(jié)果:如同 “幻覺(jué)”,記錄數(shù)憑空增加。
4.2 MySQL 的四大隔離級(jí)別
SQL 標(biāo)準(zhǔn)定義了 4 種隔離級(jí)別,隔離級(jí)別越高,一致性越強(qiáng),并發(fā)性能越低;MySQL InnoDB 默認(rèn)采用可重復(fù)讀(REPEATABLE READ)。
隔離級(jí)別對(duì)比表
| 隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 核心特點(diǎn) | 適用場(chǎng)景 |
|---|---|---|---|---|---|
| 讀未提交(READ UNCOMMITTED) | ? 會(huì)發(fā)生 | ? 會(huì)發(fā)生 | ? 會(huì)發(fā)生 | 無(wú)隔離,性能最高,數(shù)據(jù)最不安全 | 幾乎不用 |
| 讀已提交(READ COMMITTED) | ? 不會(huì) | ? 會(huì)發(fā)生 | ? 會(huì)發(fā)生 | 僅讀已提交數(shù)據(jù),主流數(shù)據(jù)庫(kù)默認(rèn)(Oracle) | 多數(shù)業(yè)務(wù)系統(tǒng) |
| 可重復(fù)讀(REPEATABLE READ) | ? 不會(huì) | ? 不會(huì) | ? 不會(huì)(InnoDB) | 同一事務(wù)多次讀取結(jié)果一致,MySQL 默認(rèn) | MySQL 默認(rèn)場(chǎng)景 |
| 串行化(SERIALIZABLE) | ? 不會(huì) | ? 不會(huì) | ? 不會(huì) | 事務(wù)串行執(zhí)行,完全隔離,性能最低 | 金融核心、數(shù)據(jù)強(qiáng)一致場(chǎng)景 |
1. 讀未提交(READ UNCOMMITTED)
- 規(guī)則:所有事務(wù)可讀取其他事務(wù)未提交的修改,無(wú)任何隔離;
- 問(wèn)題:臟讀、不可重復(fù)讀、幻讀全部存在;
- 性能:最高(幾乎不加鎖);
- 使用:生產(chǎn)環(huán)境絕對(duì)禁止,僅用于測(cè)試。
2. 讀已提交(READ COMMITTED,RC)
- 規(guī)則:事務(wù)只能讀取其他事務(wù)已提交的修改,看不到未提交數(shù)據(jù);
- 解決:臟讀;
- 殘留:不可重復(fù)讀、幻讀;
- 特點(diǎn):每次
SELECT都會(huì)生成新快照(Read View),能看到最新提交數(shù)據(jù)。
3. 可重復(fù)讀(REPEATABLE READ,RR,MySQL 默認(rèn))
- 規(guī)則:同一個(gè)事務(wù)內(nèi),多次讀取同一數(shù)據(jù),結(jié)果始終一致;
- 解決:臟讀、不可重復(fù)讀;
- 殘留:幻讀(InnoDB 通過(guò) Next-Key 鎖(間隙鎖 + 行鎖)解決幻讀);
- 特點(diǎn):事務(wù)內(nèi)第一次
SELECT生成快照(Read View),后續(xù)復(fù)用,保證可重復(fù)讀。
4. 串行化(SERIALIZABLE)
- 規(guī)則:事務(wù)串行執(zhí)行(排隊(duì)執(zhí)行),一個(gè)事務(wù)執(zhí)行完,下一個(gè)才開(kāi)始;
- 解決:臟讀、不可重復(fù)讀、幻讀全部解決;
- 性能:最低(全表鎖 / 行鎖,并發(fā)完全阻塞);
- 使用:僅用于金融核心、數(shù)據(jù)強(qiáng)一致場(chǎng)景,生產(chǎn)環(huán)境極少用。
4.3 隔離級(jí)別查看與設(shè)置
1. 查看隔離級(jí)別
-- 查看全局隔離級(jí)別 SELECT @@global.tx_isolation; -- 查看當(dāng)前會(huì)話隔離級(jí)別 SELECT @@session.tx_isolation; -- 簡(jiǎn)寫(默認(rèn)同會(huì)話) SELECT @@tx_isolation;
2. 設(shè)置隔離級(jí)別
-- 設(shè)置當(dāng)前會(huì)話隔離級(jí)別(僅當(dāng)前連接生效) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 設(shè)置全局隔離級(jí)別(新連接生效,需重啟客戶端) SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
五、隔離級(jí)別底層實(shí)現(xiàn):MVCC(多版本并發(fā)控制)
5.1 什么是 MVCC?
MVCC(Multi-Version Concurrency Control,多版本并發(fā)控制)是 InnoDB 實(shí)現(xiàn)讀已提交(RC)、可重復(fù)讀(RR) 隔離級(jí)別的核心機(jī)制,核心目標(biāo)是讀寫不阻塞、讀不加鎖、提升并發(fā)性能。
簡(jiǎn)單說(shuō),MVCC 的核心是 **“數(shù)據(jù)多版本”**:數(shù)據(jù)修改時(shí),不直接覆蓋原數(shù)據(jù),而是生成新版本,保留歷史版本;讀操作時(shí),讀取當(dāng)前事務(wù)可見(jiàn)的歷史版本,無(wú)需加鎖。
5.2 MVCC 的三大核心組件
1. 隱藏字段(每行數(shù)據(jù)自帶)
InnoDB 每行數(shù)據(jù)包含 3 個(gè)隱藏字段,用于版本管理:
DB_TRX_ID:6 字節(jié),最近修改該記錄的事務(wù) ID(插入 / 更新時(shí)賦值);DB_ROLL_PTR:7 字節(jié),回滾指針,指向該記錄的上一個(gè)版本(Undo Log 中的歷史數(shù)據(jù));DB_ROW_ID:6 字節(jié),隱式主鍵(無(wú)主鍵時(shí)自動(dòng)生成)。
2. Undo Log(回滾日志)
- 存儲(chǔ)數(shù)據(jù)的歷史版本,數(shù)據(jù)更新時(shí),舊版本寫入 Undo Log,通過(guò)
DB_ROLL_PTR形成版本鏈; - 作用:事務(wù)回滾時(shí)恢復(fù)數(shù)據(jù)、MVCC 讀取歷史版本。
3. Read View(讀視圖)
- 事務(wù)快照讀(普通 SELECT)時(shí)生成的可見(jiàn)性判斷規(guī)則,記錄當(dāng)前系統(tǒng)活躍事務(wù) ID 列表,用于判斷當(dāng)前事務(wù)能讀取哪個(gè)版本的數(shù)據(jù);
- 核心字段:
m_ids:活躍事務(wù) ID 列表;m_up_limit_id:活躍事務(wù)最小 ID;m_low_limit_id:下一個(gè)未分配事務(wù) ID;m_creator_trx_id:當(dāng)前事務(wù) ID。
5.3 快照讀 vs 當(dāng)前讀
MVCC 中,讀操作分兩種,行為完全不同:
1. 快照讀(普通 SELECT)
- SQL:
SELECT * FROM account WHERE id=1;; - 規(guī)則:讀取歷史版本數(shù)據(jù),不加鎖,依賴 MVCC;
- 場(chǎng)景:RC、RR 隔離級(jí)別下的普通查詢。
2. 當(dāng)前讀(加鎖 / 修改操作)
- SQL:
SELECT ... FOR UPDATE、UPDATE、DELETE、INSERT; - 規(guī)則:讀取最新版本數(shù)據(jù),加鎖(行鎖 / 間隙鎖),防止并發(fā)修改;
- 場(chǎng)景:數(shù)據(jù)更新、加鎖查詢。
5.4 RC vs RR:Read View 生成時(shí)機(jī)的差異
MVCC 中,RC 和 RR 隔離級(jí)別的核心區(qū)別是Read View 生成時(shí)機(jī):
- RC(讀已提交):每次快照讀(SELECT)都生成新 Read View,能看到其他事務(wù)已提交的修改,因此存在不可重復(fù)讀;
- RR(可重復(fù)讀):事務(wù)內(nèi)第一次快照讀生成 Read View,后續(xù)復(fù)用,看不到其他事務(wù)提交的修改,因此解決不可重復(fù)讀。
六、總結(jié):事務(wù)核心要點(diǎn)與實(shí)戰(zhàn)建議
6.1 核心要點(diǎn)回顧
- 事務(wù)定義:一組 DML 語(yǔ)句的整體,要么全成要么全敗,保障數(shù)據(jù)一致性;
- ACID 特性:原子性(Undo Log)、一致性(業(yè)務(wù) + ACID)、隔離性(鎖 + MVCC)、持久性(Redo Log);
- 引擎支持:僅InnoDB支持事務(wù),MyISAM 不支持;
- 隔離級(jí)別:MySQL 默認(rèn)RR(可重復(fù)讀),平衡一致性與并發(fā);
- MVCC:InnoDB 實(shí)現(xiàn) RC/RR 的核心,讀寫不阻塞、讀不加鎖,通過(guò)隱藏字段、Undo Log、Read View 實(shí)現(xiàn)。
6.2 實(shí)戰(zhàn)使用建議
- 優(yōu)先使用 InnoDB 引擎:所有需事務(wù)的表,引擎設(shè)為 InnoDB;
- 默認(rèn)隔離級(jí)別用 RR:無(wú)需特殊場(chǎng)景,保持 MySQL 默認(rèn) RR,兼顧安全與性能;
- 短事務(wù)優(yōu)先:事務(wù)內(nèi)僅包含必要操作,避免長(zhǎng)事務(wù)(易鎖超時(shí)、死鎖);
- 合理使用保存點(diǎn):復(fù)雜事務(wù)中,用 SAVEPOINT 實(shí)現(xiàn)部分回滾;
- 避免臟寫:更新數(shù)據(jù)時(shí)加索引條件,用行鎖避免表鎖,減少并發(fā)沖突。
以上就是系統(tǒng)講解MySQL數(shù)據(jù)庫(kù)中事務(wù)的核心機(jī)制與應(yīng)用實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫(kù)事務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql實(shí)現(xiàn)水平分庫(kù)的示例代碼
本文主要介紹了Mysql實(shí)現(xiàn)水平分庫(kù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
淺談mysql中concat函數(shù),mysql在字段前/后增加字符串
下面小編就為大家?guī)?lái)一篇淺談mysql中concat函數(shù),mysql在字段前/后增加字符串。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
MySQL存儲(chǔ)過(guò)程中使用WHILE循環(huán)語(yǔ)句的方法
這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程中使用WHILE循環(huán)語(yǔ)句的方法,實(shí)例分析了在MySQL中循環(huán)語(yǔ)句的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
在MySQL執(zhí)行UPDATE語(yǔ)句時(shí)遇到的錯(cuò)誤1175的解決方案
MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句時(shí)必須基于主鍵或索引列,或者使用LIMIT限制行數(shù),若SQL語(yǔ)句未滿足這些條件,會(huì)觸發(fā)錯(cuò)誤1175,本文介紹在MySQL執(zhí)行UPDATE語(yǔ)句時(shí)遇到的錯(cuò)誤1175的解決方案,感興趣的朋友一起看看吧2025-02-02

