成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

事務、隔離級別和并發一致性問題

數據庫
事務本質上就是一系列邏輯操作,不同數據庫、不同存儲引擎對事務的支持強度都是不一樣的。比如Mysql數據庫InnoDB引擎天然支持事務,而Myisam引擎則不支持事務。

?數據庫的事務一直以來是數據庫最核心的基礎知識,熟悉事務知識是深入學習數據庫的前提;同時,數據庫的事務也是互聯網面試最最最常問的知識之一。

本文我們將從以下幾個角度深入分析:

  • 事務的四大特性
  • 數據庫并發環境下的一致性問題
  • 數據庫的隔離級別分別所解決的一致性問題。

話不多說,小伙伴們,上車吧!

事務

什么是事務?

事務是數據庫系統里面非常重要的術語。它可以由一行簡單的SQL來實現,也可以由一組復雜的SQL來實現。對于MySQL來說,有兩種事務實現方式,一種是顯式事務,另一種則是隱式事務。顯式事務需要我們自己手動使用begin或start transaction開啟事務,執行完中間的SQL語句后使用commit提交事務,即手動提交。

InnoDB默認為隱式事務,即自動提交,每一行insert、update、delete的SQL語句操作都默認為一個獨立的事務。如果想關閉自動提交,可以set autocommit = 0來實現。

本質上來說,事務其實就是一系列邏輯操作,為了保證這一系列邏輯操作能夠被準確、統一、安全地執行,就需要通過規范和技術來實現事務,讓事務具備特性。

事務有什么特性?

1. 原子性(Atomicity)

一個事務被視為不可分割的最小單元,一個事務的所有操作要么全部提交成功,要么全部失敗回滾。當你為一組行為開啟事務時,這組行為的全部操作要么同時成功,要么同時失敗,不存在某一步行為成功執行而另一步執行失敗的場景。一旦某個行為操作失敗,那么這組行為里包括執行成功和執行失敗的會全部回滾,就像什么事都沒發生過一樣。

2. 隔離性(Isolation)

一個事務所做的修改在最終提交以前,對其它事務是不可見的。

3. 一致性(Consistency)

數據庫的數據在事務執行前后都保持一致性狀態。在一致性狀態下,所有事務對同一個數據的讀取結果都是相同的。不能存在同一個事務對某一組數據前后兩次讀取的內容不一致的場景。

4. 持久性(Durability)

一旦事務提交,則其所做的修改將會永遠保存到數據庫中。即使系統發生崩潰,事務執行的結果也不能丟失。

對于一個事務,想要實現它必須遵循以上ACID四個特性,也就是這四個特性必須全部得到滿足才可以稱之為一個完整的數據庫“事務”。

那么InnoDB如何去實現這四個特性呢?不同的特性其實有不同的實現方式:

圖片

并發一致性問題

什么是數據庫的并發一致性問題?

并發一致性問題,指的是在并發環境下,因為事務的隔離性很難保證,所以會出現很多并發問題。

數據庫的并發一致性問題一共有三種,分別是:

1. 臟讀(Dirty Read)

指的是事務A讀取到了事務B已經修改但是還未提交的數據。

假設A和B同時讀取一個數據,事務A讀取到這個數據的值為10,隨后將其值修改為20,按道理,事務A對這個數據的修改在事務未提交之前是不會被其他事務看到的,但是由于數據庫的隔離性未能保證,此時事務B也去讀取這個數據的值,就會直接讀取到事務A修改完之后的值20,那么此時如果事務A進行了數據的回滾,不提交了。那么事務B最終讀取到的就是一個過期的值20。

這種情況就稱為臟讀。

圖片圖片

2. 不可重復讀(Nnrepeatable Read)

指的是在一個事務里面兩次讀取到的內容不一樣。

事務B讀取到某個數據S的值為10,隨后事務A將S的值修改為20。如果B再次讀取這個數據,讀取到的值就變為20。此時讀取的結果和第一次讀取的結果不同,這就是不可重復讀。按道理,事務B都還沒有提交,所讀取到的數據應該是對別的事務不可見的,換句話來說應該是安全的。但是由于并發環境下事務的隔離型未能滿足,多個事務在某一個相同時刻對同一個數據進行修改,就會出現這樣的并發沖突問題。

圖片

3. 幻讀(Phantom Read)

指的是在一個事務內查詢某個數據范圍的數據,如果出現了兩次查詢的結果不一樣,就稱為“幻讀”。

事務A根據條件查詢到某個范圍的數據[10,20,30,40.50],此時B在這個符合條件的范圍內插入新的數據,A再次讀取這個范圍的數據后,發現該范圍多出了一條數據60,此時就發生了“幻讀”現象。幻讀現象發生的本質,也是由于事務的隔離型未能保證導致的。

圖片

所以,MySQL如何解決并發一致性問題?

首先強調一下,MySQL并不等于InnoDB。

InnoDB是MySQL5.5版本之后默認使用的存儲引擎。InnoDB使用MVCC可以解決臟讀和不可重復讀問題。但是,MVCC并不是唯一可以解決并發一致性問題的措施。MVCC本質上是一種樂觀鎖,通過比較不同事務的版本號的方式來解決問題。可以使用樂觀鎖,那么一樣也可以使用悲觀鎖。MySQL的其他存儲引擎比如Myisam甚至無法使用事務,所以它一般用鎖來解決并發一致性問題。

在這里,我先不贅述InnoDB的MVCC和MySQL各種各樣的鎖,我們放到之后的文章來講。本篇文章主要強調事務本身。

隔離級別

什么是數據庫的隔離級別?

指的是實現了數據庫中的安全級別。從對ACID的實現程度上分為四個隔離級別。隔離級別越高的數據庫越安全,能解決的并發一致性問題也就越多。

那么數據庫有幾種隔離級別呢?

1. 未提交讀(Read Uncommitted)

事務中的修改,即使沒有提交,對其它事務也是可見的。該隔離級別會發生臟讀、不可重復讀、幻讀。所以是最差的一個隔離級別。

2. 提交讀(Read Committed)

一個事務只能讀取已經提交的事務所做的修改。換句話說,一個事務所做的修改在提交之前對其它事務是不可見的,所以該隔離級別解決了臟讀問題,也就是說,當你的數據庫實現到了提交讀這個隔離級別時,臟讀現象就不會再發生。

3. 可重復讀(Repeatable Read)

保證在同一個事務中多次讀取同一數據的結果是一樣的。這是第三個隔離級別,也是InnoDB默認實現的隔離級別。

當你的數據庫實現到了提交讀這個隔離級別時,臟讀和不可重復讀現象就都不會再發生。

4. 可串行化(Serializable)

強制事務串行執行,這樣多個事務互不干擾,自然而然就不會出現并發一致性問題。

該隔離級別需要加鎖實現,因為要使用加鎖機制保證同一時間只有一個事務執行。

因為可串行化是串行執行,所以不會有并發問題。這也是最安全的,第四個隔離級別。

總結一下:

  • 讀未提交就是一種最差的數據庫隔離級別, 說明你這個數據庫在多事務的時候非常不安全;
  • 提交讀能解決臟讀問題;
  • 可重復讀能解決不可重復讀和臟讀問題;
  • 串行化能解決臟讀、不可重復讀、幻讀問題。

為什么InnoDB不默認實現可串行化?

數據庫提出了這四種隔離級別分別來解決不同的并發一致性問題。

但是,難道隔離級別越高就越好嗎?對于各大編程語言,不僅僅要考慮“安全”,還要考慮“性能”,對于數據庫一樣如此。

隔離級別越高,就代表著越安全,但是同時性能效率也就越低。你想想,當你的數據庫做到了串行化,就意味沒有并發問題產生。但是此時你讀取的數據身上掛著一把鎖,一個數據同一時刻只能被一個事務訪問,那么剩下的事務獲取不到就只能排隊。實際生產環境中往往都是在并發環境中對數據庫進行操作,業務高峰的時候甚至會有幾萬、幾十萬個事務同時存在,所以串行化往往得不到業務上的滿足。這就需要在“安全”和“性能”之間做一個衡量,于是MySQL的InnoDB存儲引擎默認實現的隔離級別為“可重復讀”,而非可串行化。

總結

事務本質上就是一系列邏輯操作,不同數據庫、不同存儲引擎對事務的支持強度都是不一樣的。比如Mysql數據庫InnoDB引擎天然支持事務,而Myisam引擎則不支持事務。

數據庫事務只有滿足了ACID四大特性,才能安全的被我們執行。如果是在某一個時刻只有一個事務在操作,那么就不會出現并發一致性問題,那么ACID就很容易滿足。因為隔離性是可以滿足的,我們只要滿足了原子性,就可以滿足一致性。

但是在多事務的并發環境下,由于事務的隔離性很難滿足,就會產生臟讀、不可重復讀、幻讀的并發一致性問題。為了解決這些并發一致性問題,數據庫系統規范了四個隔離級別:未提交讀、提交讀、可重復讀、可串行化。

隔離級別越高,并發環境下數據庫越安全,但是性能也越低。所以為了權衡安全和性能,InnoDB默認實現的隔離級別是“可重復讀”。

那么如何實現可重復讀呢?可以使用鎖,也可以使用MVCC。?

責任編輯:趙寧寧 來源: fancyJava
相關推薦

2023-12-19 09:43:43

MongoDB并發

2024-04-11 13:45:14

Redis數據庫緩存

2024-11-14 07:10:00

2016-11-29 09:00:19

分布式數據一致性CAS

2022-09-13 13:49:05

數據庫隔離

2019-05-27 09:00:00

蘇寧智慧零售平臺數據庫

2019-09-08 22:45:48

并發扣款一致性冪等性

2022-09-06 15:30:20

緩存一致性

2019-09-18 08:41:53

并發扣減一致性redis

2023-12-05 08:02:26

MySQL隔離

2017-09-04 14:46:10

分布式事務問題

2023-12-01 13:51:21

數據一致性數據庫

2019-02-13 11:04:42

系統緩存軟件

2023-04-13 08:15:47

Redis緩存一致性

2025-03-10 09:20:00

庫存異常Redis架構

2020-09-04 06:32:08

緩存數據庫接口

2025-03-24 10:17:01

2012-09-24 09:35:42

分布式系統

2022-10-19 12:22:53

并發扣款一致性

2021-09-08 11:03:13

緩存數據庫性能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品一 | 91精品国产综合久久福利软件 | 天天拍天天操 | 精品亚洲视频在线 | 成人a免费 | av官网在线 | 欧美一级在线免费观看 | 免费欧美 | 欧洲妇女成人淫片aaa视频 | 成人av网站在线观看 | 久久久不卡网国产精品一区 | 极品久久| 精品无码久久久久久国产 | 日韩精品一区中文字幕 | 伊人看片 | 欧美日韩在线免费观看 | 手机av在线| 日韩中文字幕在线视频 | 午夜a v电影 | 成人国产精品一级毛片视频毛片 | 精品一区二区三区四区五区 | 第一区在线观看免费国语入口 | 男女羞羞视频免费 | 米奇狠狠鲁 | 日本视频在线 | 81精品国产乱码久久久久久 | 97超碰人人 | 国产成人精品一区二区三区在线 | 成人一级毛片 | 九九久久精品 | 成人精品一区二区 | 欧美中文字幕一区二区三区亚洲 | 一区二区三区视频在线观看 | 亚洲自拍偷拍视频 | 黄色片免费在线观看 | 夏同学福利网 | 久久伊人一区 | 手机看黄av免费网址 | 欧美综合一区 | 国产成人精品一区 | 中文在线观看视频 |