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

MySQL事務隔離機制詳解

 更新時間:2022年11月21日 16:08:44   作者:天罡gg  
在數(shù)據(jù)庫中,事務是指一組邏輯操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位,這篇文章主要介紹了MySQL事務隔離機制,需要的朋友可以參考下

前言

如何控制并發(fā)是數(shù)據(jù)庫領域中非常重要的問題之一,MySQL為了解決并發(fā)帶來的問題,設計了事務隔離機制、鎖機制、MVCC機制,用一整套機制來解決并發(fā)問題,本文主要介紹事務隔離機制。

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

事務transaction(簡寫tx),在數(shù)據(jù)庫中,事務是指一組邏輯操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位。事務由事務開始與結束之間執(zhí)行的全部數(shù)據(jù)庫操作組成

事務具有以下4大特性,簡稱ACID:

1、原子性(Atomicity)
事務是一個原子操作單元,是不可分割的最小工作單元,就像化學中的原子,其對數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。

2、一致性(Consistent)
一致性是指事務必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài)。
一致性也稱作是完整性,就是說事務的執(zhí)行不能破壞數(shù)據(jù)庫的一致性,在事務開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài)。這意味著所有相關的數(shù)據(jù)規(guī)則都必須應用于事務的修改,以保持數(shù)據(jù)的完整性。

3、隔離性(Isolation)
數(shù)據(jù)庫提供一定的隔離機制,當多個事務并發(fā)訪問時,保證事務在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行,當然了,不同的隔離級別決定了有多“獨立”。

4、持久性(Durable)
事務完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。

小結:原子性,持久性大家基本都能秒懂,隔離性也還好大家稍微想想都能理解,就是接下來要講的隔離級別,但對一致性很多人被官方概念繞住了,其實就是在多事務并發(fā)時要保證數(shù)據(jù)的一致和完整,不理解的話先看下面的問題。

二、事務并發(fā)帶來的4類問題

1、臟讀(Dirty Reads)
事務A讀取到了事務B修改但尚未提交的數(shù)據(jù),然后事務B回滾了,因此事務A基于此數(shù)據(jù)做的操作都是無效的,就是讀到了“臟”數(shù)據(jù)(實際上不應該存在的數(shù)據(jù)),所以叫臟讀。

2、臟寫或丟失更新(Lost Update)
第一類丟失更新:撤銷rollback一個事務時,把其他事務已經(jīng)提交更新的數(shù)據(jù)回滾掉了。
第二類丟失更新:提交commit一個事務時,把其他事務已經(jīng)提交更新的數(shù)據(jù)覆蓋掉了。

3、不可重復讀(Non-Repeatable Reads)
在事務A中,按相同的條件執(zhí)行查詢過的sql,返回結果發(fā)生了修改或被刪除了,這種現(xiàn)象就叫做“不可重復讀”。

4、幻讀(Phantom Reads)
在事務A中,按相同的條件執(zhí)行查詢過的sql,返回結果中有新數(shù)據(jù)(是其它事務插入的),就好像發(fā)生了幻覺一樣,這就叫“幻讀”。

小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改或刪除,幻讀側重于新增。就這個結論網(wǎng)上很多博主寫的是不可重復讀側重于修改,幻讀側重于新增或刪除 (包括一些知名博主),大家請注意刪除不屬于幻讀,我會在第四段演示時求證。另外后面我會單獨安排一篇介紹MVCC機制,到時你自然會明白這里的原因。

三、事務4種隔離級別

在SQL標準中定義了四種隔離級別,每一種級別都規(guī)定了一個事務中所做的修改,哪些是在事務內(nèi)和事務間可見的,哪些是不可見的。較低級別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開銷也更低。

每種隔離級別可能出現(xiàn)的問題如下:

事務隔離級別臟讀不可重復讀幻讀
讀未提交(RU)可能可能可能
讀已提交(RC)不可能可能可能
可重復讀(RR)不可能不可能可能
串行化(Serializable)不可能不可能不可能

1、讀未提交(Read uncommitted,RU)

事務中的修改,即使沒有提交,對其他事務也都是可見的,由于可能造成臟讀,所以在實際應用中一般很少使用。

2、讀已提交(Read committed,RC)

事務A修改并提交的數(shù)據(jù)才會對其它事務可見,所以解決臟讀的問題。大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別都是讀已提交(像Oracle、PostgreSQL、SqlServer,但Mysql不是)。

3、可重復讀(Repeatable read,RR)
Mysql默認的事務隔離級別。它保證了在同一個事務中多次讀取相同記錄的結果是一致的,所以解決了臟讀和不可重復讀問題,但未徹底解決幻讀。

4、串行化(Serializable)

可串行化是最高的隔離級別。它通過強制事務串行執(zhí)行,避免了前面所說的臟讀,不可重復讀和幻讀問題。簡單來說,可串行化會在讀取的每一行數(shù)據(jù)上都加上鎖,所以可能導致大量的超時和鎖爭用問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下,才考慮用該級別。

四、Mysql演示4種隔離級別

在MySQL中,InnoDB引擎支持事務,MyISAM引擎不支持事務,所以本文實驗的測試環(huán)境:Windows 10 + MySQL5.7 + InnoDB。
Mysql5.7可以通過命令select @@tx_isolation;語句來查看:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

設置4種隔離級別的命令:

set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';

開始事務:

begin;

提交事務:

commit;

回滾事務:

rollback;

1、讀未提交(RU)

set tx_isolation='read-uncommitted';
select @@tx_isolation;
begin;

驗證臟讀

在這里插入圖片描述

2、讀已提交(RC)

set tx_isolation='read-committed';
select @@tx_isolation;
begin;

驗證解決臟讀,存在不可重復讀

![在這里插入圖片描述](https://img-blog.csdnimg.cn/d4406ad1415c46008d824c48a9c382e6.png

驗證幻讀

在這里插入圖片描述

3、可重復讀(RR)

set tx_isolation='repeatable-read';
select @@tx_isolation;
begin;

驗證解決臟讀和不可重復讀
上面說的不可重復讀側重于修改或刪除,求證請看下面的截圖,

在這里插入圖片描述

驗證幻讀
Mysql的RR級別在一定程度上解決了幻讀問題,但不夠徹底,至于為什么這么說?還是那句話,得深入理解MVCC機制,這個會單獨安排一篇,敬請期待!

在這里插入圖片描述

4、串行化(Serializable)

set tx_isolation='serializable';
select @@tx_isolation;
begin;

在這里插入圖片描述

如果長時間阻塞,最后會鎖等待超時,拋出異常:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
換成是在事務A執(zhí)行,結果也是一樣會阻塞,直到其它事務完成或超時拋出同樣的異常。
對于update也是同樣的道理,詳細如下圖:

在這里插入圖片描述

總結

通過本文我們已經(jīng)詳細說明了:

事務4大特性:ACID事務并發(fā)帶來的4類問題:臟讀、臟寫、不可重復讀、幻讀事務的4種隔離級別:讀未提交、讀已提交、可重復讀、串行化Mysql提供的4種隔離級別演示

剩下的MySQL鎖機制和MVCC機制,我們下文見!

參考文章:

什么是事務?
三分鐘圖解事務隔離級別,看一遍就懂
MySQL事務隔離級別詳解
MySQL的四種事務隔離級別
透徹解讀mysql的可重復讀、幻讀及實現(xiàn)原理
【MySQL (三) | 五分鐘搞清楚MySQL事務隔離級別】

到此這篇關于MySQL事務隔離機制的文章就介紹到這了,更多相關mysql事務隔離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 多種不同的 MySQL 的 SSL 配置

    多種不同的 MySQL 的 SSL 配置

    MySQL 只支持 TLS v1.0,默認不支持主機名驗證,所以你的證書可能是給db1.example.com的,也可能是給db2.example的,瀏覽器則可能會用OCSP、CRL's 或 CRLsets 來驗證證書是否有效。 MySQL 5.6以后就只支持CRL驗證。
    2016-04-04
  • MySQL在關聯(lián)復雜情況下所能做出的一些優(yōu)化

    MySQL在關聯(lián)復雜情況下所能做出的一些優(yōu)化

    這篇文章主要介紹了MySQL在關聯(lián)復雜情況下所能做出的一些優(yōu)化,作者通過添加索引來不斷優(yōu)化查詢時間,需要的朋友可以參考下
    2015-05-05
  • 一篇文章帶你深入了解Mysql觸發(fā)器

    一篇文章帶你深入了解Mysql觸發(fā)器

    這篇文章主要介紹了MySQL觸發(fā)器概念、原理與用法,結合實例形勢詳細分析了mysql觸發(fā)器相關概念、原理、創(chuàng)建、用法及操作注意事項,需要的朋友可以參考下
    2021-08-08
  • mysql快速插入大量數(shù)據(jù)的正確方法

    mysql快速插入大量數(shù)據(jù)的正確方法

    在處理大量數(shù)據(jù)時如果一條一條地插入會極大地影響效率,因此批量插入是一個更好的選擇,下面這篇文章主要給大家介紹了關于mysql快速插入大量數(shù)據(jù)的正確方法,需要的朋友可以參考下
    2024-01-01
  • MySQL優(yōu)化之InnoDB優(yōu)化

    MySQL優(yōu)化之InnoDB優(yōu)化

    InnoDB是為Mysql處理巨大數(shù)據(jù)量時的最大性能設計。它的CPU效率可能是任何其它基于磁盤的關系數(shù)據(jù)庫引擎所不能匹敵的。在數(shù)據(jù)量大的網(wǎng)站或是應用中Innodb是倍受青睞的。那么它就不需要優(yōu)化了嗎,答案很顯然:當然不是?。?!
    2017-03-03
  • MySQL中查看表結構的四種實現(xiàn)

    MySQL中查看表結構的四種實現(xiàn)

    本文主要介紹了MySQL中查看表結構的四種實現(xiàn),包含DESCRIBE/DESC、SHOW COLUMNS、SHOW CREATE TABLE和INFORMATION_SCHEMA,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • linux下mysql數(shù)據(jù)庫單向同步配置方法分享

    linux下mysql數(shù)據(jù)庫單向同步配置方法分享

    mysql數(shù)據(jù)庫單向同步又叫做主從復制,是通過二進制日志文件完成的,注意:mysql 數(shù)據(jù)庫的版本,兩個數(shù)據(jù)庫版本要相同
    2012-06-06
  • 解決sql server不支持variant數(shù)據(jù)類型的問題

    解決sql server不支持variant數(shù)據(jù)類型的問題

    在數(shù)據(jù)庫中,數(shù)據(jù)類型是非常重要的,但有時候我們可能會遇到 SQL Server 不支持的數(shù)據(jù)類型,例如 Variant,在本篇博文中,我們將探討問題的背景,提供解決思路,并總結如何解決 SQL Server 不支持 Variant 數(shù)據(jù)類型的挑戰(zhàn)
    2023-09-09
  • 淺談MySQL中不等號索引問題

    淺談MySQL中不等號索引問題

    本文主要介紹了淺談MySQL中不等號索引問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 教您修復mysql數(shù)據(jù)庫的方法

    教您修復mysql數(shù)據(jù)庫的方法

    你可能在使用MySQL過程中,各種意外導致數(shù)據(jù)庫表的損壞,而且這些數(shù)據(jù)往往是最新的數(shù)據(jù),通常不可能在備份數(shù)據(jù)中找到。本章將繼上篇文章中檢查出表的問題后,告訴你如何修復表
    2014-05-05

最新評論

林周县| 渭源县| 吴忠市| 文安县| 华亭县| 响水县| 海兴县| 呼图壁县| 日照市| 赤城县| 桐柏县| 康马县| 广安市| 彭阳县| 集贤县| 集安市| 无锡市| 辽阳县| 朝阳市| 鸡西市| 崇明县| 邵武市| 姚安县| 西青区| 吴堡县| 南丹县| 开封县| 沭阳县| 莎车县| 嵩明县| 禹城市| 教育| 云龙县| 于都县| 扎鲁特旗| 河东区| 萝北县| 罗田县| 大足县| 皋兰县| 巩义市|