亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL事務的基礎學習以及心得分享

發布時間:2021-07-30 10:59:04 來源:億速云 閱讀:99 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹了MySQL事務的基礎學習以及心得分享,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

事務是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務,下面就是關于MySQL事務學習中的心得分享:

事務的特性

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

2.一致性(Consistency):在一個事務中,事務前后數據的完整性必須保持一致,可以想象銀行轉賬、火車購票。

3.隔離性(Isolation):多個事務,事務的隔離性是指多個用戶并發訪問數據庫時, 一個用戶的事務不能被其它用戶的事務所干擾,多個并發事務之間數據要相互隔離。

4.持久性(Durability):持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

寫這些概念呢,是有點繞!繞就繞吧!反正也不是我規定的,這是官方的,解釋是我編的!!!

事務的并發訪問問題

如果我們在不考慮隔離性問題時,事務是存在三種并發訪問問題的。

1.臟讀:在一個事務中,當讀取數據時,讀到了另一個事務未提交的數據。  

比如A賬戶給B賬戶轉了1塊錢,但是A沒有提交事務,被B賬戶通過臟讀看到了,這時,B就會以為A已經把錢轉過來了,但是這時,A賬戶回滾事務。其實錢就沒給B轉過去,但是B自己本身以為A已經轉過去了,,,有點繞,估計是我描述到繞!

看代碼:

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

2.不可重復讀:在一個事務中,兩次讀取的數據內容不一致,這是因為在查詢時,有時間間隔,數據被另一個事務已經修改提交了,那就會出現問題。

3.幻讀/虛讀:在一個事務中,兩次讀取的數據量不一致。

事務的隔離級別

上面介紹了3種事務并發問題!現在介紹一下數據庫提供的解決方案!

1.read uncommitted : 讀取尚未提交的數據 :這個最低級,但是效率肯定最高,但是哪一個問題都不能解決。

2.read committed:讀取已經提交的數據 :可以解決臟讀  。

3.repeatable read:重讀讀取:可以解決臟讀 和 不可重復讀 。

4.serializable:串行化:可以解決臟讀不可重復讀和虛讀,效率最差,相當于鎖表,開發中一般不用。 

上面的“2”是oracle數據庫默認設置,“3”是mysql數據庫默認的設置。

下面呢我就重點解釋一下mysql數據庫在上面各種事務隔離級別上的演示:

首先介紹兩個語法:

1.查看mysql數據庫默認的隔離級別:select @@tx_isolation

如圖:

MySQL事務的基礎學習以及心得分享

2.設置mysql的隔離級別:set session transaction isolation level 事務的隔離級別

如圖:

MySQL事務的基礎學習以及心得分享

事務的隔離級別演示

注意:如果要自己模擬要開啟兩個mysql客戶端,也就是模擬兩個用戶!

1.read uncommitted

如圖:

MySQL事務的基礎學習以及心得分享

我通過語法將數據庫的事務隔離級別改為了read uncommitted。

首先我有一張account表。 

如圖:窗口一

MySQL事務的基礎學習以及心得分享

 窗口二

MySQL事務的基礎學習以及心得分享

數據庫表原始數據money都是5000,當我啟動事務后,在zhangsan賬戶增加了1000和在李四賬戶減去了1000,但是我的事務還未提交,但是我再次查詢數據庫表時,數據已經發生變化,這就是臟讀和不可重復讀!

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

2.read committed

 如圖:

MySQL事務的基礎學習以及心得分享

我將數據庫事務隔離性改為了read committted。

還是上面那張表:

如圖:窗口一

MySQL事務的基礎學習以及心得分享

 窗口二

 MySQL事務的基礎學習以及心得分享

數據庫表zhangsan賬戶的money和lisi賬戶的money都發生了變化,我未提交事務,在另一個窗口事務開啟下查詢時,沒有出現臟讀,但是當我提交事務時,在另一個窗口的事務下再次查詢,出現了不可重復讀的情況,這樣可以避免臟讀,但是查詢時已經出現不可重復讀和幻讀/虛讀!

3.repeatable read

如圖:

MySQL事務的基礎學習以及心得分享

我將數據庫事務隔離性改為了read committted。

還是上面那張表:

如圖:窗口一

MySQL事務的基礎學習以及心得分享

 窗口二

MySQL事務的基礎學習以及心得分享

我在兩個窗口都開啟了事務,當窗口一進行數據操作后,并進行事務提交,在窗口二的事務開啟情況下,我去查詢,沒有查詢到剛才窗口一的數據操作記錄,這樣就避免了臟讀和不可重復讀。

 有人說也避免了虛讀/幻讀,其實沒有。

 看圖:

MySQL事務的基礎學習以及心得分享

我在操作lisi賬戶時,數據只是發生修改的變化,但是當我修改wangwu這個賬戶時,再去查詢出現了wangwu,賬戶的數據,但是其實在我未操作前,wangwu賬戶的數據是查詢不出的。這就是幻讀/虛讀!

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

4.serializable

我就不演示了,開發不建議用,效率又慢,但是所有的問題都能避免!!

總結一下 

事務隔離級別的性能:

read uncommitted>read committed>repeatable read>serialazable

事務隔離級別的安全性:

read uncommitted<read committed<repeatable read<serialazable

mysql 事務控制:

開啟事務:start transaction;

提交:commit;

回滾:rollback;

感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL事務的基礎學習以及心得分享”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乾安县| 吉安县| 上高县| 石河子市| 靖西县| 九江市| 修文县| 卓尼县| 布尔津县| 彰武县| 永昌县| 平泉县| 旬邑县| 吕梁市| 仲巴县| 仁寿县| 宿迁市| 永德县| 涟水县| 太和县| 深水埗区| 龙里县| 团风县| 扶沟县| 马鞍山市| 肥东县| 东乡县| 崇礼县| 高要市| 八宿县| 茂名市| 遵义市| 宿松县| 大洼县| 连江县| 万源市| 中山市| 珠海市| 恩施市| 荥阳市| 泰来县|