最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL事務(wù)與鎖實(shí)例教程詳解

 更新時(shí)間:2022年11月05日 11:26:03   作者:宏遠(yuǎn)十一冠王  
事務(wù)是指滿(mǎn)足ACID特性的的一組操作,可以通過(guò)Commit提交事務(wù),也可以也可以通過(guò)Rollback進(jìn)行回滾。會(huì)存在中間態(tài)和一致性狀態(tài),也是真正在數(shù)據(jù)庫(kù)表中存在的狀態(tài)

MySQL事務(wù)和鎖

事務(wù)

說(shuō)到關(guān)系型的數(shù)據(jù)庫(kù)的事務(wù),相信大家對(duì)四大特性都不陌生,分別是原子性、一致性、隔離性、持久性,簡(jiǎn)稱(chēng)為ACID特性。

MySQL中支持3種不同的存儲(chǔ)引擎:

MyISAM存儲(chǔ)引擎、Memory存儲(chǔ)引擎、和InnoDB存儲(chǔ)引擎

注:只有InnoDB才支持事務(wù)。

事務(wù)的控制語(yǔ)句

控制語(yǔ)句作用
begin或者start transaction開(kāi)啟一個(gè)事務(wù)
commit 或者 commit work提交事務(wù),進(jìn)行持久性修改
rollback 或者 rollback work回滾事務(wù),撤銷(xiāo)已經(jīng)進(jìn)行修改但未提交的操作
savepoint [保存點(diǎn)]在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),一個(gè)事務(wù)可以有多個(gè)保存點(diǎn)
releasavepoint [保存點(diǎn)]回滾到指定的保存點(diǎn)
set transaction設(shè)置事務(wù)的隔離級(jí)別

事務(wù)隔離級(jí)別設(shè)置

先復(fù)習(xí)一個(gè)事務(wù)的四大隔離級(jí)別

  • 讀未提交(READ-UNCOMMITTED)
  • 讀已提交(READ-COMMITTED)
  • 可重復(fù)讀(RE-PEATABLE-READ)
  • 可序列化讀(SERIALIZABLE)

下面是操作過(guò)程。

首先,查看默認(rèn)的事務(wù)隔離級(jí)別,可以看到是可重復(fù)讀(REPEATABLE-READ),

show variables like '%isolation%';

臟讀

我們來(lái)演示一下臟讀的場(chǎng)景,下面這張圖是展示了我原先已經(jīng)創(chuàng)建好的兩個(gè)用戶(hù)的賬號(hào)都為100元。

分別打開(kāi)兩個(gè)連接mysql的會(huì)話(huà)窗口,其中一個(gè)會(huì)話(huà)的隔離級(jí)別為READ-UNCOMMITED,然后再另一個(gè)窗口中開(kāi)啟一個(gè)事務(wù),例如,lisi給zhangsan轉(zhuǎn)賬100元,

set session transaction isolation level read uncommitted;
begin;
update user set money=money-100 where user=lisi;

我們?cè)诹硗庖粋€(gè)讀未提交的窗口中查看,zhangsan看到錢(qián)已經(jīng)轉(zhuǎn)過(guò)來(lái)了,但是實(shí)際上lisi的事務(wù)還沒(méi)有提交,假如這個(gè)時(shí)候,lisi不想轉(zhuǎn)賬了,回滾事務(wù),那zhangsan就讀到臟數(shù)據(jù)了。

不可重復(fù)讀

下面來(lái)展示一下不可重復(fù)讀的場(chǎng)景。

首先我們將zhangsan的窗口的事務(wù)隔離級(jí)別設(shè)置成READ-COMMITTED,并且在兩個(gè)窗口都開(kāi)啟事務(wù)

set session transaction isolation level read committed;

假設(shè)zhangsan現(xiàn)在想統(tǒng)計(jì)全部人的錢(qián)有多少,很明顯200;

但是這個(gè)時(shí)候lisi往賬戶(hù)里面存了100元,并提交事務(wù),但是這個(gè)時(shí)候,zhangsan再次查詢(xún)總和,我們會(huì)查詢(xún)到總金額為300,但是這次查詢(xún)是處于同一個(gè)事務(wù)中,查詢(xún)到兩次不一樣的結(jié)果,屬于不可重復(fù)讀的情況。

update user set money=money+100 where user='lisi';
commit;

幻讀

為了解決不可重復(fù)讀的問(wèn)題,我們將事務(wù)的隔離等級(jí)設(shè)置成RE-PEATABLE-READ,即MySQL默認(rèn)的事務(wù)隔離等級(jí),然后在兩邊都開(kāi)啟一個(gè)事務(wù)。

set session transaction isolation level repeatable read;

 我們先在一個(gè)窗口插入一條數(shù)據(jù)并提交,然后在另外一個(gè)窗口查看,此時(shí)是查詢(xún)不到這個(gè)記錄的,但是假如這個(gè)時(shí)候我們新插入一條主鍵和剛插入的記錄一樣的話(huà),我們就可以發(fā)現(xiàn)

insert into user values('zly1',100);
# 另外一個(gè)窗口
insert into user values('zly1',100);
ERROR 1062 (23000): Duplicate entry 'zly1' for key 'user.PRIMARY'

這樣也算是一種幻讀的現(xiàn)象,但是網(wǎng)上也有一種說(shuō)法在可重復(fù)讀的等級(jí)下,幻讀是可避免的,這種說(shuō)法不是非常準(zhǔn)確的,如果在進(jìn)行更新和插入時(shí)就可能會(huì)出現(xiàn)幻讀的情況,如果想要解決幻讀的情況,可以將事務(wù)隔離等級(jí)設(shè)置到SERIALIZABLE

鎖機(jī)制

InnoDB的行級(jí)鎖

InnoDB默認(rèn)采用的行級(jí)鎖,分為以下這兩種,分別為共享鎖和排他鎖。

這兩個(gè)概念我在這篇文章中也有介紹。

共享鎖(S鎖):也叫讀鎖,如果在該數(shù)據(jù)對(duì)象上加了共享鎖,該事務(wù)可以讀取但是不能修改數(shù)據(jù)。其他事務(wù)也可以在該對(duì)象上加共享鎖,但是不能修改數(shù)據(jù)。

排他鎖(X鎖):也叫寫(xiě)鎖,在一個(gè)數(shù)據(jù)對(duì)象只有一把排他鎖,獲取到該鎖的事務(wù)可以讀取數(shù)據(jù)和修改數(shù)據(jù)。

(加鎖:一般的查詢(xún)語(yǔ)句不會(huì)加任何的鎖類(lèi)型,當(dāng)然也可以為數(shù)據(jù)加鎖,比如在select * from … for update,這樣可以為數(shù)據(jù)添加排他鎖,而使用select … lock in share mode 可以為數(shù)據(jù)添加共享鎖。

鎖實(shí)戰(zhàn)

首先關(guān)閉事務(wù)自動(dòng)提交

set autocommit=0;

我們先在一個(gè)窗口輸入一條獲取到排他鎖,雖然操作的是一條數(shù)據(jù),但是鎖的是整張表,因?yàn)槲覀儧](méi)有添加索引。

select * from user where user='zly1' for update;

這個(gè)時(shí)候我們對(duì)user這一列添加索引,就可以看到我們對(duì)其進(jìn)行加鎖就不會(huì)出現(xiàn)阻塞的情況了。

alter table user add index(user);

注:在MySQL的行級(jí)鎖是針對(duì)索引加的鎖,而不是針對(duì)表中的行加級(jí)鎖,雖然訪(fǎng)問(wèn)不同行的記錄,但是如果不存在對(duì)應(yīng)的索引,或者使用相同的索引的話(huà),就會(huì)造成鎖的沖突而鎖住整張表。

死鎖

死鎖是指兩個(gè)或者兩個(gè)以上的額事務(wù)在執(zhí)行過(guò)程中,因?yàn)榛ハ嗟牡却蛘咭驗(yàn)闋?zhēng)搶相同的資源而造成的互相等待現(xiàn)象。

我們還是采用剛剛的例子,還是將事務(wù)的自動(dòng)提交關(guān)閉掉,首先先在會(huì)話(huà)1中,更新id為1的記錄,然后在會(huì)話(huà)2中更新id為2的記錄,這個(gè)時(shí)候我們?cè)倩貋?lái)在會(huì)話(huà)1更新id為2的記錄,在會(huì)話(huà)2中更新id為1的記錄,就會(huì)產(chǎn)生一個(gè)死鎖;

總結(jié)

本文主要介紹了事務(wù)的隔離等級(jí)和事務(wù)的鎖機(jī)制,主要更加偏向于實(shí)戰(zhàn)部分,我前面也有一些文章涉及到。

到此這篇關(guān)于MySQL事務(wù)與鎖實(shí)例教程詳解的文章就介紹到這了,更多相關(guān)MySQL事務(wù)與鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Windows 64位重裝MySQL的教程(Zip版、解壓版MySQL安裝)

    Windows 64位重裝MySQL的教程(Zip版、解壓版MySQL安裝)

    這篇文章主要介紹了Windows 64位,重裝MySQL的方法(Zip版、解壓版MySQL安裝),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值需要的朋友可以參考下
    2020-02-02
  • MYsql庫(kù)與表的管理及視圖介紹

    MYsql庫(kù)與表的管理及視圖介紹

    這篇文章主要介紹了MYsql庫(kù)與表的管理及視圖介紹,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Mysql數(shù)據(jù)庫(kù)編碼問(wèn)題 (修改數(shù)據(jù)庫(kù),表,字段編碼為utf8)

    Mysql數(shù)據(jù)庫(kù)編碼問(wèn)題 (修改數(shù)據(jù)庫(kù),表,字段編碼為utf8)

    個(gè)人建議,數(shù)據(jù)庫(kù)字符集盡量使用 utf8(HTML頁(yè)面對(duì)應(yīng)的是utf-8),以使你的數(shù)據(jù)能很順利的實(shí)現(xiàn)遷移
    2011-10-10
  • MySQL 5.7.22 二進(jìn)制包安裝及免安裝版Windows配置方法

    MySQL 5.7.22 二進(jìn)制包安裝及免安裝版Windows配置方法

    這篇文章通過(guò)實(shí)例代碼給大家介紹了MySQL 5.7.22 二進(jìn)制包安裝教程,文章末尾給大家補(bǔ)充介紹了mysql 5.7.22 免安裝版Windows配置方法,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • mysql允許所有host訪(fǎng)問(wèn)的方法

    mysql允許所有host訪(fǎng)問(wèn)的方法

    下面小編就為大家?guī)?lái)一篇mysql允許所有host訪(fǎng)問(wèn)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • mysql如何在已有數(shù)據(jù)庫(kù)上統(tǒng)一字符集

    mysql如何在已有數(shù)據(jù)庫(kù)上統(tǒng)一字符集

    這篇文章主要介紹了mysql如何在已有數(shù)據(jù)庫(kù)基礎(chǔ)上換字符集,數(shù)據(jù)庫(kù)里面,部分?jǐn)?shù)據(jù)表和數(shù)據(jù)是latin1的,部分?jǐn)?shù)據(jù)表和數(shù)據(jù)是UTF8,還有部分表,表結(jié)構(gòu)是utf8而數(shù)據(jù)是latin1,下面說(shuō)一下,怎么樣字符集統(tǒng)一成utf8,需要的朋友可以參考下
    2019-06-06
  • 詳解mysql集群:一主多從架構(gòu)實(shí)現(xiàn)

    詳解mysql集群:一主多從架構(gòu)實(shí)現(xiàn)

    這篇文章主要介紹了mysql集群一主多從架構(gòu)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • MySQL數(shù)據(jù)庫(kù)使用mysqldump導(dǎo)出數(shù)據(jù)詳解

    MySQL數(shù)據(jù)庫(kù)使用mysqldump導(dǎo)出數(shù)據(jù)詳解

    mysqldump是mysql用于轉(zhuǎn)存儲(chǔ)數(shù)據(jù)庫(kù)的實(shí)用程序。它主要產(chǎn)生一個(gè)SQL腳本,其中包含從頭重新創(chuàng)建數(shù)據(jù)庫(kù)所必需的命令CREATE TABLE INSERT等。接下來(lái)通過(guò)本文給大家介紹MySQL數(shù)據(jù)庫(kù)使用mysqldump導(dǎo)出數(shù)據(jù)詳解,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • Mysql 聚合函數(shù)嵌套使用操作

    Mysql 聚合函數(shù)嵌套使用操作

    這篇文章主要介紹了Mysql 聚合函數(shù)嵌套使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • MySQL中json_extract函數(shù)說(shuō)明及使用方式

    MySQL中json_extract函數(shù)說(shuō)明及使用方式

    今天看mysql中的json數(shù)據(jù)類(lèi)型,涉及到一些使用,使用到了函數(shù)json_extract來(lái),下面這篇文章主要給大家介紹了關(guān)于MySQL中json_extract函數(shù)說(shuō)明及使用方式的相關(guān)資料,需要的朋友可以參考下
    2022-08-08

最新評(píng)論

高唐县| 清流县| 鄂尔多斯市| 孙吴县| 永兴县| 金昌市| 斗六市| 琼中| 裕民县| 卢湾区| 浮梁县| 汾阳市| 墨脱县| 渑池县| 石楼县| 惠水县| 那坡县| 临高县| 南岸区| 北安市| 平罗县| 莆田市| 永定县| 新和县| 修水县| 清涧县| 龙州县| 渑池县| 延长县| 德惠市| 宁都县| 兴仁县| 平乡县| 义乌市| 石渠县| 闸北区| 儋州市| 德钦县| 烟台市| 武鸣县| 文水县|