欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL事務(wù)的基礎(chǔ)學(xué)習(xí)以及心得分享

 更新時(shí)間:2017年12月06日 09:42:44   作者:久違的韓哥  
本篇內(nèi)容是關(guān)于MySQL事務(wù)的基礎(chǔ)知識(shí)學(xué)習(xí)內(nèi)容,并把學(xué)習(xí)中網(wǎng)友的心得做了總結(jié),分享給大家,一起學(xué)習(xí)參考下吧。

事務(wù)是邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全都成功要不全都失敗,這個(gè)特性就是事務(wù),下面就是關(guān)于MySQL事務(wù)學(xué)習(xí)中的心得分享:

事務(wù)的特性

1.原子性(Atomicity):原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。 

2.一致性(Consistency):在一個(gè)事務(wù)中,事務(wù)前后數(shù)據(jù)的完整性必須保持一致,可以想象銀行轉(zhuǎn)賬、火車(chē)購(gòu)票。

3.隔離性(Isolation):多個(gè)事務(wù),事務(wù)的隔離性是指多個(gè)用戶(hù)并發(fā)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí), 一個(gè)用戶(hù)的事務(wù)不能被其它用戶(hù)的事務(wù)所干擾,多個(gè)并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離。

4.持久性(Durability):持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,接下來(lái)即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。

寫(xiě)這些概念呢,是有點(diǎn)繞!繞就繞吧!反正也不是我規(guī)定的,這是官方的,解釋是我編的!??!

事務(wù)的并發(fā)訪(fǎng)問(wèn)問(wèn)題

如果我們?cè)诓豢紤]隔離性問(wèn)題時(shí),事務(wù)是存在三種并發(fā)訪(fǎng)問(wèn)問(wèn)題的。

1.臟讀:在一個(gè)事務(wù)中,當(dāng)讀取數(shù)據(jù)時(shí),讀到了另一個(gè)事務(wù)未提交的數(shù)據(jù)。  

比如A賬戶(hù)給B賬戶(hù)轉(zhuǎn)了1塊錢(qián),但是A沒(méi)有提交事務(wù),被B賬戶(hù)通過(guò)臟讀看到了,這時(shí),B就會(huì)以為A已經(jīng)把錢(qián)轉(zhuǎn)過(guò)來(lái)了,但是這時(shí),A賬戶(hù)回滾事務(wù)。其實(shí)錢(qián)就沒(méi)給B轉(zhuǎn)過(guò)去,但是B自己本身以為A已經(jīng)轉(zhuǎn)過(guò)去了,,,有點(diǎn)繞,估計(jì)是我描述到繞!

看代碼:

update account set money=money+1 where name='B';  --此時(shí)A去通知B
update account set money=money -1 where name='A';

2.不可重復(fù)讀:在一個(gè)事務(wù)中,兩次讀取的數(shù)據(jù)內(nèi)容不一致,這是因?yàn)樵诓樵?xún)時(shí),有時(shí)間間隔,數(shù)據(jù)被另一個(gè)事務(wù)已經(jīng)修改提交了,那就會(huì)出現(xiàn)問(wèn)題。

3.幻讀/虛讀:在一個(gè)事務(wù)中,兩次讀取的數(shù)據(jù)量不一致。

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

上面介紹了3種事務(wù)并發(fā)問(wèn)題!現(xiàn)在介紹一下數(shù)據(jù)庫(kù)提供的解決方案!

1.read uncommitted : 讀取尚未提交的數(shù)據(jù) :這個(gè)最低級(jí),但是效率肯定最高,但是哪一個(gè)問(wèn)題都不能解決。

2.read committed:讀取已經(jīng)提交的數(shù)據(jù) :可以解決臟讀  。

3.repeatable read:重讀讀?。嚎梢越鉀Q臟讀 和 不可重復(fù)讀 。

4.serializable:串行化:可以解決臟讀不可重復(fù)讀和虛讀,效率最差,相當(dāng)于鎖表,開(kāi)發(fā)中一般不用。 

上面的“2”是oracle數(shù)據(jù)庫(kù)默認(rèn)設(shè)置,“3”是mysql數(shù)據(jù)庫(kù)默認(rèn)的設(shè)置。

下面呢我就重點(diǎn)解釋一下mysql數(shù)據(jù)庫(kù)在上面各種事務(wù)隔離級(jí)別上的演示:

首先介紹兩個(gè)語(yǔ)法:

1.查看mysql數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別:select @@tx_isolation

如圖:

2.設(shè)置mysql的隔離級(jí)別:set session transaction isolation level 事務(wù)的隔離級(jí)別

如圖:

事務(wù)的隔離級(jí)別演示

注意:如果要自己模擬要開(kāi)啟兩個(gè)mysql客戶(hù)端,也就是模擬兩個(gè)用戶(hù)!

1.read uncommitted

如圖:

我通過(guò)語(yǔ)法將數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別改為了read uncommitted。

首先我有一張account表。 

如圖:窗口一

 窗口二

數(shù)據(jù)庫(kù)表原始數(shù)據(jù)money都是5000,當(dāng)我啟動(dòng)事務(wù)后,在zhangsan賬戶(hù)增加了1000和在李四賬戶(hù)減去了1000,但是我的事務(wù)還未提交,但是我再次查詢(xún)數(shù)據(jù)庫(kù)表時(shí),數(shù)據(jù)已經(jīng)發(fā)生變化,這就是臟讀和不可重復(fù)讀!

幻讀/虛讀我就不掩飾了,同樣存在!

2.read committed

 如圖:

我將數(shù)據(jù)庫(kù)事務(wù)隔離性改為了read committted。

還是上面那張表:

如圖:窗口一

 窗口二

 

 

數(shù)據(jù)庫(kù)表zhangsan賬戶(hù)的money和lisi賬戶(hù)的money都發(fā)生了變化,我未提交事務(wù),在另一個(gè)窗口事務(wù)開(kāi)啟下查詢(xún)時(shí),沒(méi)有出現(xiàn)臟讀,但是當(dāng)我提交事務(wù)時(shí),在另一個(gè)窗口的事務(wù)下再次查詢(xún),出現(xiàn)了不可重復(fù)讀的情況,這樣可以避免臟讀,但是查詢(xún)時(shí)已經(jīng)出現(xiàn)不可重復(fù)讀和幻讀/虛讀!

3.repeatable read

如圖:

我將數(shù)據(jù)庫(kù)事務(wù)隔離性改為了read committted。

還是上面那張表:

如圖:窗口一

 窗口二

我在兩個(gè)窗口都開(kāi)啟了事務(wù),當(dāng)窗口一進(jìn)行數(shù)據(jù)操作后,并進(jìn)行事務(wù)提交,在窗口二的事務(wù)開(kāi)啟情況下,我去查詢(xún),沒(méi)有查詢(xún)到剛才窗口一的數(shù)據(jù)操作記錄,這樣就避免了臟讀和不可重復(fù)讀。

 有人說(shuō)也避免了虛讀/幻讀,其實(shí)沒(méi)有。

 看圖:

我在操作lisi賬戶(hù)時(shí),數(shù)據(jù)只是發(fā)生修改的變化,但是當(dāng)我修改wangwu這個(gè)賬戶(hù)時(shí),再去查詢(xún)出現(xiàn)了wangwu,賬戶(hù)的數(shù)據(jù),但是其實(shí)在我未操作前,wangwu賬戶(hù)的數(shù)據(jù)是查詢(xún)不出的。這就是幻讀/虛讀!

如果不理解幻讀/虛讀這塊,可以查一下InnoDB。

4.serializable

我就不演示了,開(kāi)發(fā)不建議用,效率又慢,但是所有的問(wèn)題都能避免??!

總結(jié)一下 

事務(wù)隔離級(jí)別的性能:

read uncommitted>read committed>repeatable read>serialazable

事務(wù)隔離級(jí)別的安全性:

read uncommitted<read committed<repeatable read<serialazable

mysql 事務(wù)控制:

開(kāi)啟事務(wù):start transaction;

提交:commit;

回滾:rollback;

相關(guān)文章

  • MySQL實(shí)例精講單行函數(shù)以及字符數(shù)學(xué)日期流程控制

    MySQL實(shí)例精講單行函數(shù)以及字符數(shù)學(xué)日期流程控制

    SQL函數(shù)即數(shù)據(jù)庫(kù)的內(nèi)置函數(shù),可以運(yùn)用在SQL語(yǔ)句中實(shí)現(xiàn)特定的功能。SQL單行函數(shù)對(duì)于每一行數(shù)據(jù)進(jìn)行計(jì)算后得到一行輸出結(jié)果。SQL單行函數(shù)根據(jù)數(shù)據(jù)類(lèi)型分為字符函數(shù)、數(shù)字函數(shù)、日期函數(shù)、轉(zhuǎn)換函數(shù),另外還有一些別的函數(shù)
    2021-10-10
  • MySQL 觸發(fā)器(TRIGGER)的具體使用

    MySQL 觸發(fā)器(TRIGGER)的具體使用

    本文主要介紹了MySQL 觸發(fā)器(TRIGGER)的具體使用,包含INSERT 觸發(fā)器,UPDATE觸發(fā)器和DELETE觸發(fā)器這三種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • SQL中current_date()函數(shù)的實(shí)現(xiàn)

    SQL中current_date()函數(shù)的實(shí)現(xiàn)

    日期時(shí)間類(lèi)型的數(shù)據(jù)也是經(jīng)常要用到的,SQL中也提供了一些函數(shù)對(duì)這些數(shù)據(jù)進(jìn)行處理,本文主要介紹了SQL中current_date()函數(shù)的實(shí)現(xiàn),具有一定的參考價(jià)值
    2024-02-02
  • 一文詳解MySQL?Join使用原理

    一文詳解MySQL?Join使用原理

    JOIN是一種非常常見(jiàn)的操作,用于將兩個(gè)或多個(gè)表中的數(shù)據(jù)合并到一個(gè)結(jié)果集中。MySQL支持多種JOIN類(lèi)型,本文通過(guò)代碼示例詳細(xì)介紹了Join的使用優(yōu)化,有需要的小伙伴可以參考閱讀
    2023-04-04
  • MySQL數(shù)據(jù)庫(kù)中varchar類(lèi)型的數(shù)字比較大小的方法

    MySQL數(shù)據(jù)庫(kù)中varchar類(lèi)型的數(shù)字比較大小的方法

    varchar類(lèi)型的數(shù)據(jù)是不能直接比較大小的,那么MySQL數(shù)據(jù)庫(kù)中varchar類(lèi)型如何進(jìn)行數(shù)字比較大小的,本文就詳細(xì)的介紹一下
    2021-11-11
  • MySQL中interactive_timeout和wait_timeout的區(qū)別

    MySQL中interactive_timeout和wait_timeout的區(qū)別

    這篇文章主要介紹了MySQL中interactive_timeout和wait_timeout的區(qū)別,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • MySQL中文亂碼問(wèn)題解決方案

    MySQL中文亂碼問(wèn)題解決方案

    這篇文章主要介紹了MySQL中文亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 簡(jiǎn)述MySQL與Oracle的區(qū)別

    簡(jiǎn)述MySQL與Oracle的區(qū)別

    Oracle是大型數(shù)據(jù)庫(kù)而Mysql是中小型數(shù)據(jù)庫(kù),Oracle市場(chǎng)占有率達(dá)40%,Mysql只有20%左右,同時(shí)Mysql是開(kāi)源的而Oracle價(jià)格非常高
    2017-06-06
  • 微信昵稱(chēng)帶符號(hào)導(dǎo)致插入MySQL數(shù)據(jù)庫(kù)時(shí)出錯(cuò)的解決方案

    微信昵稱(chēng)帶符號(hào)導(dǎo)致插入MySQL數(shù)據(jù)庫(kù)時(shí)出錯(cuò)的解決方案

    Mysql的utf8編碼最多3個(gè)字節(jié),而Emoji表情或者某些特殊字符是4個(gè)字節(jié),所以會(huì)導(dǎo)致帶有表情的昵稱(chēng)插入數(shù)據(jù)庫(kù)時(shí)出錯(cuò),下面給大家分享下解決方案,需要的朋友參考下吧
    2016-12-12
  • Mysql binlog的查看方法

    Mysql binlog的查看方法

    MySQL的二進(jìn)制日志可以說(shuō)是MySQL最重要的日志了,本文主要介紹了Mysql binlog的查看方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04

最新評(píng)論