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

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

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

MySQL事務(wù)和鎖

事務(wù)

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

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

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

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

事務(wù)的控制語句

控制語句作用
begin或者start transaction開啟一個(gè)事務(wù)
commit 或者 commit work提交事務(wù),進(jìn)行持久性修改
rollback 或者 rollback work回滾事務(wù),撤銷已經(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)

下面是操作過程。

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

show variables like '%isolation%';

臟讀

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

分別打開兩個(gè)連接mysql的會(huì)話窗口,其中一個(gè)會(huì)話的隔離級(jí)別為READ-UNCOMMITED,然后再另一個(gè)窗口中開啟一個(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看到錢已經(jīng)轉(zhuǎn)過來了,但是實(shí)際上lisi的事務(wù)還沒有提交,假如這個(gè)時(shí)候,lisi不想轉(zhuǎn)賬了,回滾事務(wù),那zhangsan就讀到臟數(shù)據(jù)了。

不可重復(fù)讀

下面來展示一下不可重復(fù)讀的場景。

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

set session transaction isolation level read committed;

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

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

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

幻讀

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

set session transaction isolation level repeatable read;

 我們先在一個(gè)窗口插入一條數(shù)據(jù)并提交,然后在另外一個(gè)窗口查看,此時(shí)是查詢不到這個(gè)記錄的,但是假如這個(gè)時(shí)候我們新插入一條主鍵和剛插入的記錄一樣的話,我們就可以發(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)上也有一種說法在可重復(fù)讀的等級(jí)下,幻讀是可避免的,這種說法不是非常準(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鎖):也叫寫鎖,在一個(gè)數(shù)據(jù)對(duì)象只有一把排他鎖,獲取到該鎖的事務(wù)可以讀取數(shù)據(jù)和修改數(shù)據(jù)。

(加鎖:一般的查詢語句不會(huì)加任何的鎖類型,當(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)槲覀儧]有添加索引。

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í)鎖,雖然訪問不同行的記錄,但是如果不存在對(duì)應(yīng)的索引,或者使用相同的索引的話,就會(huì)造成鎖的沖突而鎖住整張表。

死鎖

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

我們還是采用剛剛的例子,還是將事務(wù)的自動(dòng)提交關(guān)閉掉,首先先在會(huì)話1中,更新id為1的記錄,然后在會(huì)話2中更新id為2的記錄,這個(gè)時(shí)候我們?cè)倩貋碓跁?huì)話1更新id為2的記錄,在會(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庫與表的管理及視圖介紹

    MYsql庫與表的管理及視圖介紹

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

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

    個(gè)人建議,數(shù)據(jù)庫字符集盡量使用 utf8(HTML頁面對(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配置方法

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

    mysql允許所有host訪問的方法

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

孝感市| 茶陵县| 永兴县| 南澳县| 西宁市| 永德县| 昆明市| 寿宁县| 德惠市| 墨竹工卡县| 武清区| 吴江市| 余江县| 东山县| 根河市| 巴东县| 云林县| 绵阳市| 贡觉县| 叶城县| 京山县| 大兴区| 铜梁县| 右玉县| 分宜县| 黎川县| 宽甸| 泸溪县| 闻喜县| 太和县| 年辖:市辖区| 罗城| 北宁市| 林甸县| 琼海市| 威宁| 玉屏| 廊坊市| 印江| 绍兴市| 运城市|