mysql的4種事務隔離級別,如下所示:
成都創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網+設計服務,主要包括網站設計、網站制作、成都app開發(fā)、小程序制作、宣傳片制作、LOGO設計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經驗豐富的經驗,可以確保每一個作品的質量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
1、未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務修改的數(shù)據(jù)。
2、提交讀(Read Committed):只能讀取到已經提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫默認都是該級別 (不重復讀)。
3、可重復讀(Repeated Read):可重復讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重復讀,但是還存在幻象讀,但是innoDB解決了幻讀。
4、串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。
相關簡介
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB?公司開發(fā),屬于?Oracle?旗下產品。MySQL 是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,在?WEB?應用方面,MySQL是最好的?RDBMS?(Relational Database Management System,關系數(shù)據(jù)庫管理系統(tǒng)) 應用軟件之一。
MySQL是一種關系型數(shù)據(jù)庫管理系統(tǒng),關系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言。MySQL 軟件采用了雙授權政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發(fā)都選擇 MySQL 作為網站數(shù)據(jù)庫。
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于Oracle旗下產品,是最流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一。
端口是3306。
表很多時,使用linux腳本,需要根據(jù)需要修改一下:
和創(chuàng)建一樣,可以加上 if exists
可兩篇文章:
如:
用于在已有的表中添加、刪除或修改列。
添加 ADD
或
默認是添加到最后,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之后
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。
修改字段名 CHANGE
可以把表2的數(shù)據(jù)復制到表1中,但 不能復制約束性條件 。
單行
多行,注意 只有一個VALUES :
不寫 (行1, 行2...) 這一部分的話,默認一一對應
除了以上方法外,還可以用SET為每一行附上相應的值。
假如沒有篩選的話,就給全部都修改了??梢杂? WHERE 篩選。
假如 沒有篩選的話,就給全部刪除了 。相當于清空。
清空
先把表刪除,然后再建一個。與 DELETE FROM 相比, TRUNCATE 的效率更快,因為 DELETE FROM 是把記錄逐條刪除的。
查詢執(zhí)行的順序
FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT
注意
當數(shù)據(jù)很大,上百萬的時候,使用LIMIT ... OFFSET ..的方式進行分頁十分浪費資源且耗時長。最好是結合WHERE使用,如:
REGEXP 使用正則表達進行匹配。 查詢時,需要搭配WHERE或HAVING使用 。
兩個表之間有交集且要用到兩個表的數(shù)據(jù)時,可以使用內連接查詢。
LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
用法:
RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。 把LEFT JOIN的表1、表2調換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行. 相當于結合了 LEFT JOIN 和 RIGHT JOIN 的結果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個查詢結果作為另一個查詢的條件。 如:
EXISTS 用于判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時執(zhí)行。 如:
索引的本質是一種排好序的數(shù)據(jù)結構。利用索引可以提高查詢速度。
常見的索引有:
MySQL通過外鍵約束來保證表與表之間的數(shù)據(jù)的完整性和準確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關聯(lián),保證數(shù)據(jù)的一致性和實現(xiàn)一些級聯(lián)操作。
對已有的兩個表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個字段,當做外鍵
為子表添加外鍵約束條件
假如刪除記錄報錯: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
這是因為MySQL中設置了foreign key關聯(lián),造成無法更新或刪除數(shù)據(jù)。可以通過設置 FOREIGN_KEY_CHECKS 變量來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那么組合查詢的結果一般為 M+N 行。
每個查詢必須包含相同的列、表達式和聚集函數(shù)。
默認會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個 ORDER BY 子句,并且必須位于語句的最后 。
內置函數(shù)很多, 見: MySQL 函數(shù)
我們一般使用 START TRANSACTION 或 BEGIN 開啟事務, COMMIT 提交事務中的命令, SAVEPOINT : 相當于設置一個還原點, ROLLBACK TO : 回滾到某個還原點下
一般的使用格式如下:
開啟事務時, 默認加鎖
根據(jù)類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫服務器實現(xiàn),行鎖由存儲引擎實現(xiàn)。
除此之外,我們可以顯示加鎖
加鎖時, 如果沒有索引,會鎖表,如果加了索引,就會鎖行
InnoDB默認支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競爭的時候就會出現(xiàn)死鎖的情況
解決方法:
即ACID特性:
由于并發(fā)事務會引發(fā)上面這些問題, 我們可以設置事務的隔離級別解決上面的問題.
MySQL的默認隔離級別(可重復讀)
查看當前會話隔離級別
方式1
方式2
設置隔離級別
主從集群的示意圖如下:
主要涉及三個線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由于MySQL主從集群只會從主節(jié)點同步到從節(jié)點, 不會反過來同步, 所以需要讀寫分離
讀寫分離需要在業(yè)務層面實現(xiàn) , 寫數(shù)據(jù)只能在主節(jié)點上完成, 而讀數(shù)據(jù)可以在主節(jié)點或從節(jié)點上完成
索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結構
MySQL的索引有
推薦兩個在線工具:
簡單來說, B樹是在紅黑樹(一個平衡二叉樹)的基礎上將一個節(jié)點存放多個值, 實現(xiàn)的, 降低了樹的高度, 每個節(jié)點都存放索引及對應數(shù)據(jù)指針, 同一層的節(jié)點是遞增的
而B+樹在B樹的基礎上進行優(yōu)化, 非葉子節(jié)點存放 子節(jié)點的開始的索引, 葉子節(jié)點存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見的 MyISAM 和 InnoDB
MyISAM 的B+樹葉子節(jié)點存放表數(shù)據(jù)的指針, InnoDB 的B+樹葉子節(jié)點存放處主鍵外的數(shù)據(jù)
其他的:
即多個列組成一個索引, 語法:
由于聯(lián)合索引的B+樹的結構, 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會全表掃描
如果你對列進行了 (+,-,*,/,!) , 那么都將不會走索引。
OR 引起的索引失效
OR 導致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個字段,那么索引 不會失效 , 反之索引失效 。
這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那么不會走索引。
這兩種用法,也將使索引失效。另 IN 會走索引,但是當IN的取值范圍較大時會導致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引
不走索引。
走索引。
所以設計表的時候, 建議不可為空, 而是將默認值設置為 "" ( NOT NULL DEFAULT "" )
修改方法
有兩種方法可以對配置了 systemd 的程序進行資源隔離:1. 命令行修改:通過執(zhí)行?systemctl set-property?命令實現(xiàn),形式為?systemctl set-property?name parameter=value;修改默認即時生效。2. 手工修改文件:直接編輯程序的 systemd unit file 文件,完成之后需手工執(zhí)行?systemctl?daemon-reload?更新配置,并重啟服務?systemctl restart name.service。
systemd unit file 里支持的資源隔離配置項,如常見的:
CPUQuota=value
該參數(shù)表示服務可以獲取的最大 CPU 時間,value 為百分數(shù)形式,高于 100% 表示可使用?1 核以上的?CPU。與 cgroup cpu 控制器?cpu.cfs_quota_us?配置項對應。
MemoryLimit=value
該參數(shù)表示服務可以使用的最大內存量,value 可以使用 K, M, G, T 等后綴表示值的大小。與 cgroup?memory 控制器?memory.limit_in_bytes?配置項對應。
事務的4種隔離級別
READ UNCOMMITTED ? ? ? 未提交讀,可以讀取未提交的數(shù)據(jù)。
READ COMMITTED ? ? ? ? 已提交讀,對于鎖定讀(select with for update 或者 for share)、update 和 delete 語句,InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。 ? ? ? ? ? ? ? ? ? ?
Gap locking 僅用于外鍵約束檢查和重復鍵檢查。
REPEATABLE READ ? ? ? ?可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。
SERIALIZABLE ? ? ? ? ? 序列化在了解了 4 種隔離級別的需求后,在采用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數(shù)據(jù)本身間隙),以及了解整個數(shù)據(jù)范圍的全集組成。
數(shù)據(jù)范圍全集組成
SQL 語句根據(jù)條件判斷不需要掃描的數(shù)據(jù)范圍(不加鎖);
SQL 語句根據(jù)條件掃描到的可能需要加鎖的數(shù)據(jù)范圍;
以單個數(shù)據(jù)范圍為例,數(shù)據(jù)范圍全集包含:(數(shù)據(jù)范圍不一定是連續(xù)的值,也可能是間隔的值組成)
只要字段值還可以繼續(xù)拆分,就不滿足第一范式。
范式設計得越詳細,對某些實際操作可能會更好,但并非都有好處,需要對項目的實際情況進行設定。
在滿足第一范式的前提下,其他列都必須完全依賴于主鍵列。 如果出現(xiàn)不完全依賴,只可能發(fā)生在聯(lián)合主鍵的情況下:
實際上,在這張訂單表中,product_name 只依賴于 product_id ,customer_name 只依賴于 customer_id。也就是說,product_name 和 customer_id 是沒用關系的,customer_name 和 product_id 也是沒有關系的。
這就不滿足第二范式:其他列都必須完全依賴于主鍵列!
拆分之后,myorder 表中的 product_id 和 customer_id 完全依賴于 order_id 主鍵,而 product 和 customer 表中的其他字段又完全依賴于主鍵。滿足了第二范式的設計!
在滿足第二范式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關系。
表中的 customer_phone 有可能依賴于 order_id 、 customer_id 兩列,也就不滿足了第三范式的設計:其他列之間不能有傳遞依賴關系。
修改后就不存在其他列之間的傳遞依賴關系,其他列都只依賴于主鍵列,滿足了第三范式的設計!
查詢每門課的平均成績。
查詢 score 表中至少有 2 名學生選修,并以 3 開頭的課程的平均分數(shù)。
分析表發(fā)現(xiàn),至少有 2 名學生選修的課程是 3-105 、3-245 、6-166 ,以 3 開頭的課程是 3-105 、3-245。也就是說,我們要查詢所有 3-105 和 3-245 的 degree 平均分。
查詢所有學生的 name,以及該學生在 score 表中對應的 c_no 和 degree 。
通過分析可以發(fā)現(xiàn),只要把 score 表中的 s_no 字段值替換成 student 表中對應的 name 字段值就可以了,如何做呢?
查詢所有學生的 no 、課程名稱 ( course 表中的 name ) 和成績 ( score 表中的 degree ) 列。
只有 score 關聯(lián)學生的 no ,因此只要查詢 score 表,就能找出所有和學生相關的 no 和 degree :
然后查詢 course 表:
只要把 score 表中的 c_no 替換成 course 表中對應的 name 字段值就可以了。
查詢所有學生的 name 、課程名 ( course 表中的 name ) 和 degree 。
只有 score 表中關聯(lián)學生的學號和課堂號,我們只要圍繞著 score 這張表查詢就好了。
只要把 s_no 和 c_no 替換成 student 和 srouse 表中對應的 name 字段值就好了。
首先把 s_no 替換成 student 表中的 name 字段:
再把 c_no 替換成 course 表中的 name 字段:
查詢 95031 班學生每門課程的平均成績。
在 score 表中根據(jù) student 表的學生編號篩選出學生的課堂號和成績:
這時只要將 c_no 分組一下就能得出 95031 班學生每門課的平均成績:
查詢在 3-105 課程中,所有成績高于 109 號同學的記錄。
首先篩選出課堂號為 3-105 ,在找出所有成績高于 109 號同學的的行。
查詢所有成績高于 109 號同學的 3-105 課程成績記錄。
查詢所有和 101 、108 號學生同年出生的 no 、name 、birthday 列。
查詢 '張旭' 教師任課的學生成績表。
首先找到教師編號:
通過 sourse 表找到該教師課程號:
通過篩選出的課程號查詢成績表:
查詢某選修課程多于5個同學的教師姓名。
首先在 teacher 表中,根據(jù) no 字段來判斷該教師的同一門課程是否有至少5名學員選修:
查看和教師編號有有關的表的信息:
我們已經找到和教師編號有關的字段就在 course 表中,但是還無法知道哪門課程至少有5名學生選修,所以還需要根據(jù) score 表來查詢:
根據(jù)篩選出來的課程號,找出在某課程中,擁有至少5名學員的教師編號:
在 teacher 表中,根據(jù)篩選出來的教師編號找到教師姓名:
查詢 “計算機系” 課程的成績表。
思路是,先找出 course 表中所有 計算機系 課程的編號,然后根據(jù)這個編號查詢 score 表。
查詢 計算機系 與 電子工程系 中的不同職稱的教師。
查詢課程 3-105 且成績 至少 高于 3-245 的 score 表。
查詢課程 3-105 且成績高于 3-245 的 score 表。
查詢某課程成績比該課程平均成績低的 score 表。
查詢所有任課 ( 在 course 表里有課程 ) 教師的 name 和 department 。
查詢 student 表中至少有 2 名男生的 class 。
查詢 student 表中不姓 "王" 的同學記錄。
查詢 student 表中每個學生的姓名和年齡。
查詢 student 表中最大和最小的 birthday 值。
以 class 和 birthday 從大到小的順序查詢 student 表。
查詢 "男" 教師及其所上的課程。
查詢最高分同學的 score 表。
查詢和 "李軍" 同性別的所有同學 name 。
查詢和 "李軍" 同性別且同班的同學 name 。
查詢所有選修 "計算機導論" 課程的 "男" 同學成績表。
需要的 "計算機導論" 和性別為 "男" 的編號可以在 course 和 student 表中找到。
建立一個 grade 表代表學生的成績等級,并插入數(shù)據(jù):
查詢所有學生的 s_no 、c_no 和 grade 列。
思路是,使用區(qū)間 ( BETWEEN ) 查詢,判斷學生的成績 ( degree ) 在 grade 表的 low 和 upp 之間。
準備用于測試連接查詢的數(shù)據(jù):
分析兩張表發(fā)現(xiàn),person 表并沒有為 cardId 字段設置一個在 card 表中對應的 id 外鍵。如果設置了的話,person 中 cardId 字段值為 6 的行就插不進去,因為該 cardId 值在 card 表中并沒有。
要查詢這兩張表中有關系的數(shù)據(jù),可以使用 INNER JOIN ( 內連接 ) 將它們連接在一起。
完整顯示左邊的表 ( person ) ,右邊的表如果符合條件就顯示,不符合則補 NULL 。
完整顯示右邊的表 ( card ) ,左邊的表如果符合條件就顯示,不符合則補 NULL 。
完整顯示兩張表的全部數(shù)據(jù)。
在 MySQL 中,事務其實是一個最小的不可分割的工作單元。事務能夠 保證一個業(yè)務的完整性 。
比如我們的銀行轉賬:
在實際項目中,假設只有一條 SQL 語句執(zhí)行成功,而另外一條執(zhí)行失敗了,就會出現(xiàn)數(shù)據(jù)前后不一致。
因此,在執(zhí)行多條有關聯(lián) SQL 語句時, 事務 可能會要求這些 SQL 語句要么同時執(zhí)行成功,要么就都執(zhí)行失敗。
在 MySQL 中,事務的 自動提交 狀態(tài)默認是開啟的。
自動提交的作用 :當我們執(zhí)行一條 SQL 語句的時候,其產生的效果就會立即體現(xiàn)出來,且不能 回滾 。
什么是回滾?舉個例子:
可以看到,在執(zhí)行插入語句后數(shù)據(jù)立刻生效,原因是 MySQL 中的事務自動將它 提交 到了數(shù)據(jù)庫中。那么所謂 回滾 的意思就是,撤銷執(zhí)行過的所有 SQL 語句,使其回滾到 最后一次提交 數(shù)據(jù)時的狀態(tài)。
在 MySQL 中使用 ROLLBACK 執(zhí)行回滾:
由于所有執(zhí)行過的 SQL 語句都已經被提交過了,所以數(shù)據(jù)并沒有發(fā)生回滾。那如何讓數(shù)據(jù)可以發(fā)生回滾?
將自動提交關閉后,測試數(shù)據(jù)回滾:
那如何將虛擬的數(shù)據(jù)真正提交到數(shù)據(jù)庫中?使用 COMMIT :
事務的實際應用 ,讓我們再回到銀行轉賬項目:
這時假設在轉賬時發(fā)生了意外,就可以使用 ROLLBACK 回滾到最后一次提交的狀態(tài):
這時我們又回到了發(fā)生意外之前的狀態(tài),也就是說,事務給我們提供了一個可以反悔的機會。假設數(shù)據(jù)沒有發(fā)生意外,這時可以手動將數(shù)據(jù)真正提交到數(shù)據(jù)表中:COMMIT 。
事務的默認提交被開啟 ( @@AUTOCOMMIT = 1 ) 后,此時就不能使用事務回滾了。但是我們還可以手動開啟一個事務處理事件,使其可以發(fā)生回滾:
仍然使用 COMMIT 提交數(shù)據(jù),提交后無法再發(fā)生本次事務的回滾。
事務的四大特征:
事務的隔離性可分為四種 ( 性能從低到高 ) :
查看當前數(shù)據(jù)庫的默認隔離級別:
修改隔離級別:
測試 READ UNCOMMITTED ( 讀取未提交 ) 的隔離性:
由于小明的轉賬是在新開啟的事務上進行操作的,而該操作的結果是可以被其他事務(另一方的淘寶店)看見的,因此淘寶店的查詢結果是正確的,淘寶店確認到賬。但就在這時,如果小明在它所處的事務上又執(zhí)行了 ROLLBACK 命令,會發(fā)生什么?
這就是所謂的 臟讀 ,一個事務讀取到另外一個事務還未提交的數(shù)據(jù)。這在實際開發(fā)中是不允許出現(xiàn)的。
把隔離級別設置為 READ COMMITTED :
這樣,再有新的事務連接進來時,它們就只能查詢到已經提交過的事務數(shù)據(jù)了。但是對于當前事務來說,它們看到的還是未提交的數(shù)據(jù),例如:
但是這樣還有問題,那就是假設一個事務在操作數(shù)據(jù)時,其他事務干擾了這個事務的數(shù)據(jù)。例如:
雖然 READ COMMITTED 讓我們只能讀取到其他事務已經提交的數(shù)據(jù),但還是會出現(xiàn)問題,就是 在讀取同一個表的數(shù)據(jù)時,可能會發(fā)生前后不一致的情況。* 這被稱為* 不可重復讀現(xiàn)象 ( READ COMMITTED ) 。
將隔離級別設置為 REPEATABLE READ ( 可被重復讀取 ) :
測試 REPEATABLE READ ,假設在兩個不同的連接上分別執(zhí)行 START TRANSACTION :
當前事務開啟后,沒提交之前,查詢不到,提交后可以被查詢到。但是,在提交之前其他事務被開啟了,那么在這條事務線上,就不會查詢到當前有操作事務的連接。相當于開辟出一條單獨的線程。
無論小張是否執(zhí)行過 COMMIT ,在小王這邊,都不會查詢到小張的事務記錄,而是只會查詢到自己所處事務的記錄:
這是 因為小王在此之前開啟了一個新的事務 ( START TRANSACTION ) * ,那么* 在他的這條新事務的線上,跟其他事務是沒有聯(lián)系的 ,也就是說,此時如果其他事務正在操作數(shù)據(jù),它是不知道的。
然而事實是,在真實的數(shù)據(jù)表中,小張已經插入了一條數(shù)據(jù)。但是小王此時并不知道,也插入了同一條數(shù)據(jù),會發(fā)生什么呢?
報錯了,操作被告知已存在主鍵為 6 的字段。這種現(xiàn)象也被稱為 幻讀,一個事務提交的數(shù)據(jù),不能被其他事務讀取到 。
顧名思義,就是所有事務的 寫入操作 全都是串行化的。什么意思?把隔離級別修改成 SERIALIZABLE :
還是拿小張和小王來舉例:
此時會發(fā)生什么呢?由于現(xiàn)在的隔離級別是 SERIALIZABLE ( 串行化 ) ,串行化的意思就是:假設把所有的事務都放在一個串行的隊列中,那么所有的事務都會按照 固定順序執(zhí)行 ,執(zhí)行完一個事務后再繼續(xù)執(zhí)行下一個事務的 寫入操作 ( 這意味著隊列中同時只能執(zhí)行一個事務的寫入操作 ) 。
根據(jù)這個解釋,小王在插入數(shù)據(jù)時,會出現(xiàn)等待狀態(tài),直到小張執(zhí)行 COMMIT 結束它所處的事務,或者出現(xiàn)等待超時。
轉載: