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

Mysql數(shù)據(jù)庫事務(wù)的臟讀幻讀及不可重復(fù)讀詳解

 更新時間:2022年05月30日 09:59:18   作者:把蘋果咬哭的測試筆記  
這篇文章主要為大家介紹了Mysql數(shù)據(jù)庫事務(wù)的臟讀幻讀及不可重復(fù)讀詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、什么是數(shù)據(jù)庫事務(wù)

數(shù)據(jù)庫事務(wù)( transaction)是訪問并可能操作各種數(shù)據(jù)項的一個數(shù)據(jù)庫操作序列,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位。事務(wù)由事務(wù)開始與事務(wù)結(jié)束之間執(zhí)行的全部數(shù)據(jù)庫操作組成。——百度百科

比如,你有2條sql要執(zhí)行,如果放到一個事務(wù)里,要么2個sql都執(zhí)行成功,要么都失敗。都執(zhí)行成功了就提交事務(wù),有一個失敗了就回滾,不存在一個成功一個失敗。

二、事務(wù)的ACID原則

這是數(shù)據(jù)庫事務(wù)的核心所在。

1. 原子性(Atomicity)

比如現(xiàn)在A有800元,B有200元,A給B轉(zhuǎn)賬200元。完成此場景有2步,可以當(dāng)做在一個事務(wù)里:

1- A:800-200=600
2- B:200+200=400

那么,這2個步驟只能都成功,或者都失敗。如果一個成功一個失敗了,那么有一個人的錢就不對了。原子性就是表示不能只發(fā)生其中一個動作。

2. 一致性(Consistency)

針對一個事務(wù)操作前與操作后的狀態(tài)一致。

比如現(xiàn)在A有800元,B有200元,2個人總計是1000元。那么不管這2個人之間怎么轉(zhuǎn)來轉(zhuǎn)去,總和一定還是1000元,錢不會憑空產(chǎn)生或消失。

3. 持久性(Durability)

對于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對數(shù)據(jù)庫的改變不被丟失,即使數(shù)據(jù)庫出現(xiàn)故障。

比如現(xiàn)在A有800元,B有200元,此時A要給B轉(zhuǎn)賬200,或有2種情況:

1. 事務(wù)還沒提交,這時候服務(wù)掛了或者斷電,那么重啟數(shù)據(jù)庫后,數(shù)據(jù)狀態(tài)應(yīng)該為:A有800元,B有200元

2. 事務(wù)已經(jīng)提交,這時候服務(wù)掛了或者斷電,那么重啟數(shù)據(jù)庫后,數(shù)據(jù)狀態(tài)應(yīng)該為:A有600元,B有400元

可以看到,事務(wù)一旦提交,就會持久化到數(shù)據(jù)庫里,不會因外界原因?qū)е聰?shù)據(jù)丟失。

4. 隔離性(Isolation)

事務(wù)的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對其他事務(wù)必須是透明的。

比如現(xiàn)在有2個事務(wù)同時進行,A和C同時在給B轉(zhuǎn)賬:

事務(wù)一:A有800元,B有200元,A給B轉(zhuǎn)賬200元

事務(wù)二:C有1000元,B有200元,C給B轉(zhuǎn)賬100元

這2個事務(wù)不會互相影響。隔離性就是針對多用戶同時操作的情況下,排除其他事務(wù)對本事務(wù)的影響。

三、隔離帶來的問題

數(shù)據(jù)庫的事務(wù)隔離級別有4個,強度從低到高依次為:
Read uncommitted 、Read committed 、Repeatable readSerializable,而隨著隔離級別的不同,會引發(fā)一些其他的問題。

1. 臟讀

一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù),就是臟讀。

事務(wù)1: A給B轉(zhuǎn)賬500,但是事務(wù)未提交。

事務(wù)2: B查看了賬戶,發(fā)現(xiàn)A轉(zhuǎn)過來500,本來只轉(zhuǎn)300過來就好,發(fā)現(xiàn)多轉(zhuǎn)了200,心里美滋滋。。。

事務(wù)1: A及時發(fā)現(xiàn)多轉(zhuǎn)了200,修改了轉(zhuǎn)300,提交事務(wù)。

最終,B再次查看賬戶的時候發(fā)現(xiàn)還是只多了300塊,白高興一場,這種就是臟讀。當(dāng)隔離級別設(shè)置為Read uncommitted時可能會出現(xiàn)該情況。
若避開臟讀,可以設(shè)置隔離級別為Read committed。

2. 不可重復(fù)讀

一個事務(wù)先后讀取同一條記錄,而事務(wù)在兩次讀取之間該數(shù)據(jù)被其它事務(wù)所修改,則兩次讀取的數(shù)據(jù)不同,這種就是不可重復(fù)讀。

事務(wù)1:B去買東西,卡里有500塊錢,消費100,還沒提交事務(wù)。

事務(wù)2:B的老婆把B的500塊錢轉(zhuǎn)出去了,已提交事務(wù)。

事務(wù)1:B此時提交事務(wù),支付不了。再次讀取發(fā)現(xiàn)卡里沒錢支付。

當(dāng)隔離級別設(shè)置為Read committed,可以避免臟讀,但是可能會造成不可重復(fù)讀。
若避開不可重復(fù)讀,可以設(shè)置隔離級別為Repeatable read。

3.幻讀

一個事務(wù)按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為幻讀。

事務(wù)1:B的老婆查看B的卡消費記錄,目前共消費了500元。

事務(wù)2:B此時剛在外面請朋友吃完飯,付款了100,事務(wù)已提交。

B的老婆決定把賬單打印出來,晚上跟B對賬,卻發(fā)現(xiàn)打印出來的消費為600元。她剛才明明看到是500,怎么是600,難道是幻覺?

Mysql的默認隔離級別為Repeatable read,可以避免不可重復(fù)讀,但是可能出現(xiàn)幻讀的情況。

如果要繼續(xù)解決幻讀,那么可以將隔離級別設(shè)置為最高級的Serializable,這時候事務(wù)都是按照順序執(zhí)行的,臟讀、幻讀、不可重復(fù)度都可以避免,但是性能很差。

四、手動測試下事務(wù)的過程

可以在mysql里手動去執(zhí)行事務(wù)提交的過程,輔助理解?,F(xiàn)在來模擬一個轉(zhuǎn)賬的過程,A給B轉(zhuǎn)賬500。

先創(chuàng)造下測試條件,造庫、表、數(shù)據(jù)。

-- 創(chuàng)建庫
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 使用庫
USE shop;
-- 創(chuàng)建表
CREATE TABLE `account`(
	`id` INT(3) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(30) NOT NULL,
	`money` DECIMAL(9,2) NOT NULL,
	PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 插入數(shù)據(jù)
INSERT INTO account(`name`,`money`)
VALUES ('A', 2000.00),('B', 10000.00)

上述sql都執(zhí)行完即可,現(xiàn)在有2條測試數(shù)據(jù)。

接下來手動執(zhí)行事務(wù)提交的過程。

  • 關(guān)閉自動提交
SET autocommit = 0; -- 關(guān)閉自動提交,默認是打開

執(zhí)行sql。

  • 開啟一個事務(wù)
START TRANSACTION -- 開啟一個事務(wù)

執(zhí)行sql。

  • 定義事務(wù)里的sql
    開啟事務(wù)后的sql,就是定義在一個事務(wù)里了。
UPDATE account SET money=money - 500 WHERE `name` = 'A' -- A減去500
UPDATE account SET money=money - 500 WHERE `name` = 'B' -- B增加500

執(zhí)行后,數(shù)據(jù)變更。A加了500,B少了500。

現(xiàn)在我不去提交,進行回滾。

ROLLBACK; -- 回滾

數(shù)據(jù)變回最開始的樣子。

重新執(zhí)行2條sql,并且提交事務(wù)。

UPDATE `shop`.`account` SET `money`=`money` - 500 WHERE `name` = 'A'; -- A減去500
UPDATE `shop`.`account` SET `money`=`money` + 500 WHERE `name` = 'B'; -- B增加500
COMMIT; -- 提交事務(wù)

數(shù)據(jù)修改成功,此時再次執(zhí)行回滾,數(shù)據(jù)已經(jīng)不可逆了。

以上就是Mysql數(shù)據(jù)庫事務(wù)的臟讀幻讀及不可重復(fù)讀詳解的詳細內(nèi)容,更多關(guān)于Mysql數(shù)據(jù)庫事務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql 聯(lián)合索引生效的條件及索引失效的條件

    mysql 聯(lián)合索引生效的條件及索引失效的條件

    兩個或更多個列上的索引被稱作復(fù)合索引,本文主要介紹了mysql 聯(lián)合索引生效的條件及索引失效的條件,感興趣的可以了解一下
    2021-11-11
  • MySQL學(xué)習(xí)之三大范式詳解小白篇

    MySQL學(xué)習(xí)之三大范式詳解小白篇

    本篇文章為大家介紹了MYSQL數(shù)據(jù)庫學(xué)習(xí)中三大范式的規(guī)則詳解,有需要的朋友可以借鑒參考下,希望可以對大家的數(shù)據(jù)庫學(xué)習(xí)有所幫助
    2021-09-09
  • xtrabackup備份還原MySQL數(shù)據(jù)庫

    xtrabackup備份還原MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了xtrabackup備份還原MySQL數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Linux系統(tǒng)徹底刪除Mysql的詳細教程

    Linux系統(tǒng)徹底刪除Mysql的詳細教程

    我們在重新安裝MySQL、或更新MySQL版本時,一定會遇到mysql數(shù)據(jù)殘留(臟數(shù)據(jù)),或組件沖突等問題,下面這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)徹底刪除Mysql的詳細教程,需要的朋友可以參考下
    2023-02-02
  • 一文帶你搞懂MySQL的事務(wù)隔離級別

    一文帶你搞懂MySQL的事務(wù)隔離級別

    這篇文章主要給大家介紹了MySQL事務(wù)隔離級別,事務(wù)隔離級別分別是讀未提交,讀已提交,可重復(fù)讀,串行化,文中有詳細的圖文介紹,需要的朋友可以參考下
    2023-07-07
  • MySQL數(shù)據(jù)庫基礎(chǔ)學(xué)習(xí)之JSON函數(shù)各類操作詳解

    MySQL數(shù)據(jù)庫基礎(chǔ)學(xué)習(xí)之JSON函數(shù)各類操作詳解

    很多日常業(yè)務(wù)場景都會用到j(luò)son文件作為數(shù)據(jù)存儲起來,而mysql5.7以上就提供了存儲json的支撐。這篇文章就為大家整理了MySQL中JSON函數(shù)的各類操作,感興趣的可以了解一下
    2023-02-02
  • MongoDB日期查詢操作圖文詳解

    MongoDB日期查詢操作圖文詳解

    MongoDB中按日期查詢是一種常見的查詢操作,而按日期查詢也是開發(fā)人員在MongoDB工作中最常遇到的查詢?nèi)蝿?wù)之一,這篇文章主要給大家介紹了關(guān)于MongoDB日期查詢操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • 提升MYSQL查詢效率的10個SQL語句優(yōu)化技巧

    提升MYSQL查詢效率的10個SQL語句優(yōu)化技巧

    MySQL數(shù)據(jù)庫執(zhí)行效率對程序的執(zhí)行速度有很大的影響,有效的處理優(yōu)化數(shù)據(jù)庫是非常有用的。尤其是大量數(shù)據(jù)需要處理的時候
    2018-03-03
  • MySQL索引優(yōu)化的實際案例分析

    MySQL索引優(yōu)化的實際案例分析

    這篇文章主要介紹了MySQL索引優(yōu)化的一些實際案例,主要是用到Order by desc/asc limit M的方法,需要的朋友可以參考下
    2015-05-05
  • Mysql數(shù)據(jù)庫中數(shù)據(jù)表的優(yōu)化、外鍵與三范式用法實例分析

    Mysql數(shù)據(jù)庫中數(shù)據(jù)表的優(yōu)化、外鍵與三范式用法實例分析

    這篇文章主要介紹了Mysql數(shù)據(jù)庫中數(shù)據(jù)表的優(yōu)化、外鍵與三范式用法,結(jié)合實例形式較為詳細的分析了Mysql數(shù)據(jù)庫中數(shù)據(jù)表的優(yōu)化、外鍵與三范式相關(guān)概念、原理、用法及操作注意事項,需要的朋友可以參考下
    2019-11-11

最新評論