欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql怎么查看級(jí)別,mysql層級(jí)查詢

MySQL的默認(rèn)事務(wù)隔離級(jí)別是?

mysql的4種事務(wù)隔離級(jí)別,如下所示:

成都創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)、網(wǎng)站制作成都app開發(fā)小程序制作、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

1、未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會(huì)話中未提交事務(wù)修改的數(shù)據(jù)。

2、提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫(kù)默認(rèn)都是該級(jí)別 (不重復(fù)讀)。

3、可重復(fù)讀(Repeated Read):可重復(fù)讀。在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開始時(shí)刻一致的,InnoDB默認(rèn)級(jí)別。在SQL標(biāo)準(zhǔn)中,該隔離級(jí)別消除了不可重復(fù)讀,但是還存在幻象讀,但是innoDB解決了幻讀。

4、串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級(jí)共享鎖,讀寫相互都會(huì)阻塞。

相關(guān)簡(jiǎn)介

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB?公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在?WEB?應(yīng)用方面,MySQL是最好的?RDBMS?(Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之一。

MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)系數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。

MySQL所使用的 SQL 語(yǔ)言是用于訪問數(shù)據(jù)庫(kù)的最常用標(biāo)準(zhǔn)化語(yǔ)言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫(kù)。

MYSQL使用基礎(chǔ)、進(jìn)階分享

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB公司開發(fā),屬于Oracle旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。

端口是3306。

表很多時(shí),使用linux腳本,需要根據(jù)需要修改一下:

和創(chuàng)建一樣,可以加上 if exists

可兩篇文章:

如:

用于在已有的表中添加、刪除或修改列。

添加 ADD

默認(rèn)是添加到最后,但可以指定位置。 FIRST :添加最前

AFTER 字段名 :添加指定字段之后

例子:

刪除 DROP

修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。

修改字段名 CHANGE

可以把表2的數(shù)據(jù)復(fù)制到表1中,但 不能復(fù)制約束性條件 。

單行

多行,注意 只有一個(gè)VALUES :

不寫 (行1, 行2...) 這一部分的話,默認(rèn)一一對(duì)應(yīng)

除了以上方法外,還可以用SET為每一行附上相應(yīng)的值。

假如沒有篩選的話,就給全部都修改了。可以用 WHERE 篩選。

假如 沒有篩選的話,就給全部刪除了 。相當(dāng)于清空。

清空

先把表刪除,然后再建一個(gè)。與 DELETE FROM 相比, TRUNCATE 的效率更快,因?yàn)? DELETE FROM 是把記錄逐條刪除的。

查詢執(zhí)行的順序

FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT

注意

當(dāng)數(shù)據(jù)很大,上百萬(wàn)的時(shí)候,使用LIMIT ... OFFSET ..的方式進(jìn)行分頁(yè)十分浪費(fèi)資源且耗時(shí)長(zhǎng)。最好是結(jié)合WHERE使用,如:

REGEXP 使用正則表達(dá)進(jìn)行匹配。 查詢時(shí),需要搭配WHERE或HAVING使用 。

兩個(gè)表之間有交集且要用到兩個(gè)表的數(shù)據(jù)時(shí),可以使用內(nèi)連接查詢。

LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。

用法:

RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結(jié)果為 NULL。 把LEFT JOIN的表1、表2調(diào)換順序,就是REGHT JOIN 。

FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個(gè)表中存在匹配,則返回行. 相當(dāng)于結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。

但 MySQL中不支持 FULL OUTER JOIN 。

即SELECT嵌套。

IN 一個(gè)查詢結(jié)果作為另一個(gè)查詢的條件。 如:

EXISTS 用于判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時(shí)執(zhí)行。 如:

索引的本質(zhì)是一種排好序的數(shù)據(jù)結(jié)構(gòu)。利用索引可以提高查詢速度。

常見的索引有:

MySQL通過外鍵約束來(lái)保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性。 外鍵的使用條件:

外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作。

對(duì)已有的兩個(gè)表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b

為子表添加一個(gè)字段,當(dāng)做外鍵

為子表添加外鍵約束條件

假如刪除記錄報(bào)錯(cuò): [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)

這是因?yàn)镸ySQL中設(shè)置了foreign key關(guān)聯(lián),造成無(wú)法更新或刪除數(shù)據(jù)。可以通過設(shè)置 FOREIGN_KEY_CHECKS 變量來(lái)避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:?jiǎn)?dòng)外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當(dāng)前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;

使用 UNION 來(lái)組合兩個(gè)查詢,如果第一個(gè)查詢返回 M 行,第二個(gè)查詢返回 N 行,那么組合查詢的結(jié)果一般為 M+N 行。

每個(gè)查詢必須包含相同的列、表達(dá)式和聚集函數(shù)。

默認(rèn)會(huì)去除相同行,如果需要 保留 相同行,使用 UNION ALL 。

只能包含一個(gè) ORDER BY 子句,并且必須位于語(yǔ)句的最后 。

內(nèi)置函數(shù)很多, 見: MySQL 函數(shù)

我們一般使用 START TRANSACTION 或 BEGIN 開啟事務(wù), COMMIT 提交事務(wù)中的命令, SAVEPOINT : 相當(dāng)于設(shè)置一個(gè)還原點(diǎn), ROLLBACK TO : 回滾到某個(gè)還原點(diǎn)下

一般的使用格式如下:

開啟事務(wù)時(shí), 默認(rèn)加鎖

根據(jù)類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。

根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫(kù)服務(wù)器實(shí)現(xiàn),行鎖由存儲(chǔ)引擎實(shí)現(xiàn)。

除此之外,我們可以顯示加鎖

加鎖時(shí), 如果沒有索引,會(huì)鎖表,如果加了索引,就會(huì)鎖行

InnoDB默認(rèn)支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競(jìng)爭(zhēng)的時(shí)候就會(huì)出現(xiàn)死鎖的情況

解決方法:

即ACID特性:

由于并發(fā)事務(wù)會(huì)引發(fā)上面這些問題, 我們可以設(shè)置事務(wù)的隔離級(jí)別解決上面的問題.

MySQL的默認(rèn)隔離級(jí)別(可重復(fù)讀)

查看當(dāng)前會(huì)話隔離級(jí)別

方式1

方式2

設(shè)置隔離級(jí)別

主從集群的示意圖如下:

主要涉及三個(gè)線程: binlog 線程、 I/O 線程和 SQL 線程。

同步流程:

由于MySQL主從集群只會(huì)從主節(jié)點(diǎn)同步到從節(jié)點(diǎn), 不會(huì)反過來(lái)同步, 所以需要讀寫分離

讀寫分離需要在業(yè)務(wù)層面實(shí)現(xiàn) , 寫數(shù)據(jù)只能在主節(jié)點(diǎn)上完成, 而讀數(shù)據(jù)可以在主節(jié)點(diǎn)或從節(jié)點(diǎn)上完成

索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)

MySQL的索引有

推薦兩個(gè)在線工具:

簡(jiǎn)單來(lái)說, B樹是在紅黑樹(一個(gè)平衡二叉樹)的基礎(chǔ)上將一個(gè)節(jié)點(diǎn)存放多個(gè)值, 實(shí)現(xiàn)的, 降低了樹的高度, 每個(gè)節(jié)點(diǎn)都存放索引及對(duì)應(yīng)數(shù)據(jù)指針, 同一層的節(jié)點(diǎn)是遞增的

而B+樹在B樹的基礎(chǔ)上進(jìn)行優(yōu)化, 非葉子節(jié)點(diǎn)存放 子節(jié)點(diǎn)的開始的索引, 葉子節(jié)點(diǎn)存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點(diǎn)之間有雙向的指針

如下示意圖:

不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見的 MyISAM 和 InnoDB

MyISAM 的B+樹葉子節(jié)點(diǎn)存放表數(shù)據(jù)的指針, InnoDB 的B+樹葉子節(jié)點(diǎn)存放處主鍵外的數(shù)據(jù)

其他的:

即多個(gè)列組成一個(gè)索引, 語(yǔ)法:

由于聯(lián)合索引的B+樹的結(jié)構(gòu), 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會(huì)全表掃描

如果你對(duì)列進(jìn)行了 (+,-,*,/,!) , 那么都將不會(huì)走索引。

OR 引起的索引失效

OR 導(dǎo)致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個(gè)字段,那么索引 不會(huì)失效 , 反之索引失效 。

這個(gè)我相信大家都明白,模糊搜索如果你前綴也進(jìn)行模糊搜索,那么不會(huì)走索引。

這兩種用法,也將使索引失效。另 IN 會(huì)走索引,但是當(dāng)IN的取值范圍較大時(shí)會(huì)導(dǎo)致索引失效,走全表掃描, 見: MySQL中使用IN會(huì)不會(huì)走索引

不走索引。

走索引。

所以設(shè)計(jì)表的時(shí)候, 建議不可為空, 而是將默認(rèn)值設(shè)置為 "" ( NOT NULL DEFAULT "" )

如何查看mysql數(shù)據(jù)庫(kù)隔離級(jí)別

修改方法

有兩種方法可以對(duì)配置了 systemd 的程序進(jìn)行資源隔離:1. 命令行修改:通過執(zhí)行?systemctl set-property?命令實(shí)現(xiàn),形式為?systemctl set-property?name parameter=value;修改默認(rèn)即時(shí)生效。2. 手工修改文件:直接編輯程序的 systemd unit file 文件,完成之后需手工執(zhí)行?systemctl?daemon-reload?更新配置,并重啟服務(wù)?systemctl restart name.service。

systemd unit file 里支持的資源隔離配置項(xiàng),如常見的:

CPUQuota=value

該參數(shù)表示服務(wù)可以獲取的最大 CPU 時(shí)間,value 為百分?jǐn)?shù)形式,高于 100% 表示可使用?1 核以上的?CPU。與 cgroup cpu 控制器?cpu.cfs_quota_us?配置項(xiàng)對(duì)應(yīng)。

MemoryLimit=value

該參數(shù)表示服務(wù)可以使用的最大內(nèi)存量,value 可以使用 K, M, G, T 等后綴表示值的大小。與 cgroup?memory 控制器?memory.limit_in_bytes?配置項(xiàng)對(duì)應(yīng)。

事務(wù)的4種隔離級(jí)別

READ UNCOMMITTED ? ? ? 未提交讀,可以讀取未提交的數(shù)據(jù)。

READ COMMITTED ? ? ? ? 已提交讀,對(duì)于鎖定讀(select with for update 或者 for share)、update 和 delete 語(yǔ)句,InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。 ? ? ? ? ? ? ? ? ? ?

Gap locking 僅用于外鍵約束檢查和重復(fù)鍵檢查。

REPEATABLE READ ? ? ? ?可重復(fù)讀,事務(wù)中的一致性讀取讀取的是事務(wù)第一次讀取所建立的快照。

SERIALIZABLE ? ? ? ? ? 序列化在了解了 4 種隔離級(jí)別的需求后,在采用鎖控制隔離級(jí)別的基礎(chǔ)上,我們需要了解加鎖的對(duì)象(數(shù)據(jù)本身間隙),以及了解整個(gè)數(shù)據(jù)范圍的全集組成。

數(shù)據(jù)范圍全集組成

SQL 語(yǔ)句根據(jù)條件判斷不需要掃描的數(shù)據(jù)范圍(不加鎖);

SQL 語(yǔ)句根據(jù)條件掃描到的可能需要加鎖的數(shù)據(jù)范圍;

以單個(gè)數(shù)據(jù)范圍為例,數(shù)據(jù)范圍全集包含:(數(shù)據(jù)范圍不一定是連續(xù)的值,也可能是間隔的值組成)

MySQL知識(shí)點(diǎn)總結(jié)

只要字段值還可以繼續(xù)拆分,就不滿足第一范式。

范式設(shè)計(jì)得越詳細(xì),對(duì)某些實(shí)際操作可能會(huì)更好,但并非都有好處,需要對(duì)項(xiàng)目的實(shí)際情況進(jìn)行設(shè)定。

在滿足第一范式的前提下,其他列都必須完全依賴于主鍵列。 如果出現(xiàn)不完全依賴,只可能發(fā)生在聯(lián)合主鍵的情況下:

實(shí)際上,在這張訂單表中,product_name 只依賴于 product_id ,customer_name 只依賴于 customer_id。也就是說,product_name 和 customer_id 是沒用關(guān)系的,customer_name 和 product_id 也是沒有關(guān)系的。

這就不滿足第二范式:其他列都必須完全依賴于主鍵列!

拆分之后,myorder 表中的 product_id 和 customer_id 完全依賴于 order_id 主鍵,而 product 和 customer 表中的其他字段又完全依賴于主鍵。滿足了第二范式的設(shè)計(jì)!

在滿足第二范式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關(guān)系。

表中的 customer_phone 有可能依賴于 order_id 、 customer_id 兩列,也就不滿足了第三范式的設(shè)計(jì):其他列之間不能有傳遞依賴關(guān)系。

修改后就不存在其他列之間的傳遞依賴關(guān)系,其他列都只依賴于主鍵列,滿足了第三范式的設(shè)計(jì)!

查詢每門課的平均成績(jī)。

查詢 score 表中至少有 2 名學(xué)生選修,并以 3 開頭的課程的平均分?jǐn)?shù)。

分析表發(fā)現(xiàn),至少有 2 名學(xué)生選修的課程是 3-105 、3-245 、6-166 ,以 3 開頭的課程是 3-105 、3-245。也就是說,我們要查詢所有 3-105 和 3-245 的 degree 平均分。

查詢所有學(xué)生的 name,以及該學(xué)生在 score 表中對(duì)應(yīng)的 c_no 和 degree 。

通過分析可以發(fā)現(xiàn),只要把 score 表中的 s_no 字段值替換成 student 表中對(duì)應(yīng)的 name 字段值就可以了,如何做呢?

查詢所有學(xué)生的 no 、課程名稱 ( course 表中的 name ) 和成績(jī) ( score 表中的 degree ) 列。

只有 score 關(guān)聯(lián)學(xué)生的 no ,因此只要查詢 score 表,就能找出所有和學(xué)生相關(guān)的 no 和 degree :

然后查詢 course 表:

只要把 score 表中的 c_no 替換成 course 表中對(duì)應(yīng)的 name 字段值就可以了。

查詢所有學(xué)生的 name 、課程名 ( course 表中的 name ) 和 degree 。

只有 score 表中關(guān)聯(lián)學(xué)生的學(xué)號(hào)和課堂號(hào),我們只要圍繞著 score 這張表查詢就好了。

只要把 s_no 和 c_no 替換成 student 和 srouse 表中對(duì)應(yīng)的 name 字段值就好了。

首先把 s_no 替換成 student 表中的 name 字段:

再把 c_no 替換成 course 表中的 name 字段:

查詢 95031 班學(xué)生每門課程的平均成績(jī)。

在 score 表中根據(jù) student 表的學(xué)生編號(hào)篩選出學(xué)生的課堂號(hào)和成績(jī):

這時(shí)只要將 c_no 分組一下就能得出 95031 班學(xué)生每門課的平均成績(jī):

查詢?cè)?3-105 課程中,所有成績(jī)高于 109 號(hào)同學(xué)的記錄。

首先篩選出課堂號(hào)為 3-105 ,在找出所有成績(jī)高于 109 號(hào)同學(xué)的的行。

查詢所有成績(jī)高于 109 號(hào)同學(xué)的 3-105 課程成績(jī)記錄。

查詢所有和 101 、108 號(hào)學(xué)生同年出生的 no 、name 、birthday 列。

查詢 '張旭' 教師任課的學(xué)生成績(jī)表。

首先找到教師編號(hào):

通過 sourse 表找到該教師課程號(hào):

通過篩選出的課程號(hào)查詢成績(jī)表:

查詢某選修課程多于5個(gè)同學(xué)的教師姓名。

首先在 teacher 表中,根據(jù) no 字段來(lái)判斷該教師的同一門課程是否有至少5名學(xué)員選修:

查看和教師編號(hào)有有關(guān)的表的信息:

我們已經(jīng)找到和教師編號(hào)有關(guān)的字段就在 course 表中,但是還無(wú)法知道哪門課程至少有5名學(xué)生選修,所以還需要根據(jù) score 表來(lái)查詢:

根據(jù)篩選出來(lái)的課程號(hào),找出在某課程中,擁有至少5名學(xué)員的教師編號(hào):

在 teacher 表中,根據(jù)篩選出來(lái)的教師編號(hào)找到教師姓名:

查詢 “計(jì)算機(jī)系” 課程的成績(jī)表。

思路是,先找出 course 表中所有 計(jì)算機(jī)系 課程的編號(hào),然后根據(jù)這個(gè)編號(hào)查詢 score 表。

查詢 計(jì)算機(jī)系 與 電子工程系 中的不同職稱的教師。

查詢課程 3-105 且成績(jī) 至少 高于 3-245 的 score 表。

查詢課程 3-105 且成績(jī)高于 3-245 的 score 表。

查詢某課程成績(jī)比該課程平均成績(jī)低的 score 表。

查詢所有任課 ( 在 course 表里有課程 ) 教師的 name 和 department 。

查詢 student 表中至少有 2 名男生的 class 。

查詢 student 表中不姓 "王" 的同學(xué)記錄。

查詢 student 表中每個(gè)學(xué)生的姓名和年齡。

查詢 student 表中最大和最小的 birthday 值。

以 class 和 birthday 從大到小的順序查詢 student 表。

查詢 "男" 教師及其所上的課程。

查詢最高分同學(xué)的 score 表。

查詢和 "李軍" 同性別的所有同學(xué) name 。

查詢和 "李軍" 同性別且同班的同學(xué) name 。

查詢所有選修 "計(jì)算機(jī)導(dǎo)論" 課程的 "男" 同學(xué)成績(jī)表。

需要的 "計(jì)算機(jī)導(dǎo)論" 和性別為 "男" 的編號(hào)可以在 course 和 student 表中找到。

建立一個(gè) grade 表代表學(xué)生的成績(jī)等級(jí),并插入數(shù)據(jù):

查詢所有學(xué)生的 s_no 、c_no 和 grade 列。

思路是,使用區(qū)間 ( BETWEEN ) 查詢,判斷學(xué)生的成績(jī) ( degree ) 在 grade 表的 low 和 upp 之間。

準(zhǔn)備用于測(cè)試連接查詢的數(shù)據(jù):

分析兩張表發(fā)現(xiàn),person 表并沒有為 cardId 字段設(shè)置一個(gè)在 card 表中對(duì)應(yīng)的 id 外鍵。如果設(shè)置了的話,person 中 cardId 字段值為 6 的行就插不進(jìn)去,因?yàn)樵?cardId 值在 card 表中并沒有。

要查詢這兩張表中有關(guān)系的數(shù)據(jù),可以使用 INNER JOIN ( 內(nèi)連接 ) 將它們連接在一起。

完整顯示左邊的表 ( person ) ,右邊的表如果符合條件就顯示,不符合則補(bǔ) NULL 。

完整顯示右邊的表 ( card ) ,左邊的表如果符合條件就顯示,不符合則補(bǔ) NULL 。

完整顯示兩張表的全部數(shù)據(jù)。

在 MySQL 中,事務(wù)其實(shí)是一個(gè)最小的不可分割的工作單元。事務(wù)能夠 保證一個(gè)業(yè)務(wù)的完整性 。

比如我們的銀行轉(zhuǎn)賬:

在實(shí)際項(xiàng)目中,假設(shè)只有一條 SQL 語(yǔ)句執(zhí)行成功,而另外一條執(zhí)行失敗了,就會(huì)出現(xiàn)數(shù)據(jù)前后不一致。

因此,在執(zhí)行多條有關(guān)聯(lián) SQL 語(yǔ)句時(shí), 事務(wù) 可能會(huì)要求這些 SQL 語(yǔ)句要么同時(shí)執(zhí)行成功,要么就都執(zhí)行失敗。

在 MySQL 中,事務(wù)的 自動(dòng)提交 狀態(tài)默認(rèn)是開啟的。

自動(dòng)提交的作用 :當(dāng)我們執(zhí)行一條 SQL 語(yǔ)句的時(shí)候,其產(chǎn)生的效果就會(huì)立即體現(xiàn)出來(lái),且不能 回滾 。

什么是回滾?舉個(gè)例子:

可以看到,在執(zhí)行插入語(yǔ)句后數(shù)據(jù)立刻生效,原因是 MySQL 中的事務(wù)自動(dòng)將它 提交 到了數(shù)據(jù)庫(kù)中。那么所謂 回滾 的意思就是,撤銷執(zhí)行過的所有 SQL 語(yǔ)句,使其回滾到 最后一次提交 數(shù)據(jù)時(shí)的狀態(tài)。

在 MySQL 中使用 ROLLBACK 執(zhí)行回滾:

由于所有執(zhí)行過的 SQL 語(yǔ)句都已經(jīng)被提交過了,所以數(shù)據(jù)并沒有發(fā)生回滾。那如何讓數(shù)據(jù)可以發(fā)生回滾?

將自動(dòng)提交關(guān)閉后,測(cè)試數(shù)據(jù)回滾:

那如何將虛擬的數(shù)據(jù)真正提交到數(shù)據(jù)庫(kù)中?使用 COMMIT :

事務(wù)的實(shí)際應(yīng)用 ,讓我們?cè)倩氐姐y行轉(zhuǎn)賬項(xiàng)目:

這時(shí)假設(shè)在轉(zhuǎn)賬時(shí)發(fā)生了意外,就可以使用 ROLLBACK 回滾到最后一次提交的狀態(tài):

這時(shí)我們又回到了發(fā)生意外之前的狀態(tài),也就是說,事務(wù)給我們提供了一個(gè)可以反悔的機(jī)會(huì)。假設(shè)數(shù)據(jù)沒有發(fā)生意外,這時(shí)可以手動(dòng)將數(shù)據(jù)真正提交到數(shù)據(jù)表中:COMMIT 。

事務(wù)的默認(rèn)提交被開啟 ( @@AUTOCOMMIT = 1 ) 后,此時(shí)就不能使用事務(wù)回滾了。但是我們還可以手動(dòng)開啟一個(gè)事務(wù)處理事件,使其可以發(fā)生回滾:

仍然使用 COMMIT 提交數(shù)據(jù),提交后無(wú)法再發(fā)生本次事務(wù)的回滾。

事務(wù)的四大特征:

事務(wù)的隔離性可分為四種 ( 性能從低到高 ) :

查看當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別:

修改隔離級(jí)別:

測(cè)試 READ UNCOMMITTED ( 讀取未提交 ) 的隔離性:

由于小明的轉(zhuǎn)賬是在新開啟的事務(wù)上進(jìn)行操作的,而該操作的結(jié)果是可以被其他事務(wù)(另一方的淘寶店)看見的,因此淘寶店的查詢結(jié)果是正確的,淘寶店確認(rèn)到賬。但就在這時(shí),如果小明在它所處的事務(wù)上又執(zhí)行了 ROLLBACK 命令,會(huì)發(fā)生什么?

這就是所謂的 臟讀 ,一個(gè)事務(wù)讀取到另外一個(gè)事務(wù)還未提交的數(shù)據(jù)。這在實(shí)際開發(fā)中是不允許出現(xiàn)的。

把隔離級(jí)別設(shè)置為 READ COMMITTED :

這樣,再有新的事務(wù)連接進(jìn)來(lái)時(shí),它們就只能查詢到已經(jīng)提交過的事務(wù)數(shù)據(jù)了。但是對(duì)于當(dāng)前事務(wù)來(lái)說,它們看到的還是未提交的數(shù)據(jù),例如:

但是這樣還有問題,那就是假設(shè)一個(gè)事務(wù)在操作數(shù)據(jù)時(shí),其他事務(wù)干擾了這個(gè)事務(wù)的數(shù)據(jù)。例如:

雖然 READ COMMITTED 讓我們只能讀取到其他事務(wù)已經(jīng)提交的數(shù)據(jù),但還是會(huì)出現(xiàn)問題,就是 在讀取同一個(gè)表的數(shù)據(jù)時(shí),可能會(huì)發(fā)生前后不一致的情況。* 這被稱為* 不可重復(fù)讀現(xiàn)象 ( READ COMMITTED ) 。

將隔離級(jí)別設(shè)置為 REPEATABLE READ ( 可被重復(fù)讀取 ) :

測(cè)試 REPEATABLE READ ,假設(shè)在兩個(gè)不同的連接上分別執(zhí)行 START TRANSACTION :

當(dāng)前事務(wù)開啟后,沒提交之前,查詢不到,提交后可以被查詢到。但是,在提交之前其他事務(wù)被開啟了,那么在這條事務(wù)線上,就不會(huì)查詢到當(dāng)前有操作事務(wù)的連接。相當(dāng)于開辟出一條單獨(dú)的線程。

無(wú)論小張是否執(zhí)行過 COMMIT ,在小王這邊,都不會(huì)查詢到小張的事務(wù)記錄,而是只會(huì)查詢到自己所處事務(wù)的記錄:

這是 因?yàn)樾⊥踉诖酥伴_啟了一個(gè)新的事務(wù) ( START TRANSACTION ) * ,那么* 在他的這條新事務(wù)的線上,跟其他事務(wù)是沒有聯(lián)系的 ,也就是說,此時(shí)如果其他事務(wù)正在操作數(shù)據(jù),它是不知道的。

然而事實(shí)是,在真實(shí)的數(shù)據(jù)表中,小張已經(jīng)插入了一條數(shù)據(jù)。但是小王此時(shí)并不知道,也插入了同一條數(shù)據(jù),會(huì)發(fā)生什么呢?

報(bào)錯(cuò)了,操作被告知已存在主鍵為 6 的字段。這種現(xiàn)象也被稱為 幻讀,一個(gè)事務(wù)提交的數(shù)據(jù),不能被其他事務(wù)讀取到 。

顧名思義,就是所有事務(wù)的 寫入操作 全都是串行化的。什么意思?把隔離級(jí)別修改成 SERIALIZABLE :

還是拿小張和小王來(lái)舉例:

此時(shí)會(huì)發(fā)生什么呢?由于現(xiàn)在的隔離級(jí)別是 SERIALIZABLE ( 串行化 ) ,串行化的意思就是:假設(shè)把所有的事務(wù)都放在一個(gè)串行的隊(duì)列中,那么所有的事務(wù)都會(huì)按照 固定順序執(zhí)行 ,執(zhí)行完一個(gè)事務(wù)后再繼續(xù)執(zhí)行下一個(gè)事務(wù)的 寫入操作 ( 這意味著隊(duì)列中同時(shí)只能執(zhí)行一個(gè)事務(wù)的寫入操作 ) 。

根據(jù)這個(gè)解釋,小王在插入數(shù)據(jù)時(shí),會(huì)出現(xiàn)等待狀態(tài),直到小張執(zhí)行 COMMIT 結(jié)束它所處的事務(wù),或者出現(xiàn)等待超時(shí)。

轉(zhuǎn)載:

網(wǎng)站標(biāo)題:mysql怎么查看級(jí)別,mysql層級(jí)查詢
新聞來(lái)源:http://chinadenli.net/article21/dsshcjd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化App開發(fā)ChatGPT品牌網(wǎng)站制作網(wǎng)站制作營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)