日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL事务详解

發布時間:2024/1/1 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL事务详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

引例

什么是事務

一個完整事務所具有的四大屬性

為什么會出現事務

事務常見操作方式

事務隔離級別

為什么要存在隔離級別

一致性


引例

如下圖,是一個火車售票系統,當客戶端A發現還有一張票時,將票賣掉,還沒執行更新數據庫

時,客戶端B發現票數大于0,又賣了一次票,A將票數更新回數據庫,這樣就出現了同一張票賣出

去兩次的情況

CURD得滿足下面4個特性,才能解決上述問題

買票的過程得是原子的吧 買票互相應該不能影響吧 買完票應該要永久有效吧 買前,和買后都要是確定的狀態吧

什么是事務

假設一種場景:你畢業了,學校的教務系統后臺 MySQL 中,不再需要你的數據,要刪除你的所有 信息(一般不會),那么在刪除你的基本信息(姓名,電話,籍貫等)的同時,也刪除和你有關的其他 信息,比如:你的各科成績,你在校表現,甚至你在論壇發過的文章等。這樣,就需要多條 MySQL 語句構成,那么所有這些操作合起來,就構成了一個事務 所有的sql操作,一般都會被mysql包裝成為事務,以事務的方式提交的!!!

?一個完整事務所具有的四大屬性(簡稱:ACID)

原子性:一個事務中的所有操作,要么全部完成,要么全部不完成,不會結束在間某個環節。事 務在執行過程中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務從來沒有執行過一樣 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完 全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工 隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務 并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交、讀提交 可重復讀和串行化 持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失 為什么會出現事務 為了當應用程序訪問數據庫的時候,事務能夠簡化我們的編程模型,不需要我們去考慮各種各 樣的潛在錯誤和并發問題,本質上是為了應用層服務的 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務, MyISAM 不支持,如下圖 事務的提交方式常見的有兩種: 自動提交 手動提交 自動提交默認是打開的! 也能自己打開或關閉! 事務常見操作方式 為了便于演示,我們將mysql的默認隔離級別設置成讀未提交 設置后需要重啟終端,進行查看

正常演示 - 證明事務的開始與回滾 啟動事務:start transaction / begin savepoint s:在兩條記錄間設置斷點 rollback to s:回滾到斷點s前的上一條數據(s是在兩條記錄間設置的斷點) rollback:回滾到最開始 非正常演示1 - 證明未commit,客戶端崩潰,MySQL自動會回滾 手動啟動一個事務的時候,和mysql中是否事務會自動提交無關!如下圖 非正常演示2 - 證明commit了,客戶端崩潰,MySQL數據不會在受影響,已經持久化 非正常演示4 - 證明單條 SQL 與事務的關系 事務沒有啟動,自動提交打開與不打開的區別如下圖

其實我們之前的所有的單挑sql,本質在mysql中,全部各自會被以事務的方式進行提交的!

自動提交是給mysql中的單挑sql設置的,即我們的默認行為

注意:如果一個事務被提交了,則不可以回退!!!

事務隔離級別

一個事務可能由多條SQL構成,也就意味著,任何一個事務,都有執行前,執行中,執行后的階 數據庫中,為了保證事務執行過程中盡量不受干擾,就有了一個重要特征:隔離性? 數據庫中,允許事務受不同程度的干擾,就有了一種重要特征:隔離級別 隔離級別 讀未提交(Read Uncommitted): 在該隔離級別,所有的事務都可以看到其他事務沒有提交的 執行結果,相當于沒有任何隔離性,也會有很多并發問題,如臟讀,幻讀,不可重復讀等 讀提交(Read Committed)?:該隔離級別是大多數數據庫的默認的隔離級別(不是 MySQL 默認 的),它滿足了隔離的簡單定義:一個事務只能看到其他的已經提交的事務所做的改變,會引起不 可重復讀,即一個事務執行時,如果多次 select, 可能得到不同的結果 可重復讀(Repeatable Read): 這是 MySQL 默認的隔離級別,它確保同一個事務,在執行中,多 次讀取操作數據時,會看到同樣的數據行,會有幻讀問題 串行化(Serializable): 這是事務的最高隔離級別,它通過強制事務排序,使之不可能相互沖突, 從而解決了幻讀的問題,在每個讀的數據行上面加上共享鎖,。但是可能會導致超時和鎖競爭 隔離級別如何實現:隔離,基本都是通過鎖實現的,不同的隔離級別,鎖的使用是不同的。常見 有,表鎖,行鎖,讀鎖,寫鎖,間隙鎖(GAP),Next-Key鎖(GAP+行鎖)等 查看與設置隔離性 SELECT @@global.tx_isolation(全局)?/ session.tx_isolation(當前會話) / tx_isolation; SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 設置當前會話隔離性,只影響當前會話,不需要重啟 設置全局隔離性,另一個會話也會被影響,需要重啟 讀未提交 如下圖,一個事務插入數據未提交,就能被另一個事務讀取到,這種現象叫做臟讀!如果是誤操 作,然后將讀取后的結果交給上層,就會很不安全! 讀提交 如下圖,左端事務提交前和提交后,右端事務讀取到兩種結果,這種現象叫做不可重復讀,不可重 復讀是一個問題 你已提交,別人能讀到,不應該等價于,你已經提交,和你"并行運行"的事務也能讀到!!! 不可重復讀有什么問題——應用層會有什么影響?以銀行為例 如下圖,王某在銀行的錢余額因為個人原因存在一些變化,從10億->5500w->3000w,而銀行讀取 事務這邊就會因為不可重復讀,即每次讀到的值不一樣,給王某發了三個禮物,這是存在很大的安 全問題的!!! 可重復讀 如下圖,左端事務修改完畢提交后,右邊事務讀取的值還是未發生改變,只有右邊事務也commit 后,才能看到更新后的數據!這種現象叫做可重復讀! 一般的數據庫在可重復讀情況的時候,無法屏蔽其他事務insert的數據,因為隔離性實現是對數據 加鎖完成的,而insert待插入的數據因為并不存在,那么一般加鎖無法屏蔽這類問題,會造成雖然 大部分內容是可重復讀的,但是insert的數據在可重復讀情況被讀取出來,導致多次查找時,會多 查找出來新的記錄,就如同產生了幻覺。這種現象,叫做幻讀,MySQL解決了這個問題! 串行化 如下圖,左端事務更新數據,卻卡住了,只能等右端提交后,更新語句才能結束,這說明串行化指 的是事務之間的串行

中隔離級別越嚴格,安全性越高,但數據庫的并發性能也就越低,往往需要在兩者之間找一個平衡

點!!!

隔離性:mysql的內部機制,讓"同時"啟動,并發執行的各個事務,看到不同的數據修改(增刪

改),就叫做隔離性!

隔離級別:我們作為一個事務,可以看到不同可見性的數據,程度的不同,叫做隔離級別!

為什么要存在隔離級別

為了安全和效率,安全和效率之間需要找平衡點,這不是mysql決定的,而是由用戶決定的,而至

于為什么有種類繁多的隔離級別,這是因為應用場景的需要,比如某些場景下,不需要怎么考慮安

全,只注重效率就行!

一致性

事務執行的結果,必須使數據庫從一個一致性狀態,變到另一個一致性狀態 MySQL中在技術上不存在一致性,技術上,是通過AID(原子性,持久性,隔離性)保證C(一致性) 例如:你給別人轉賬,你賬上的余額減少了,而對方的余額因為系統運行中斷卻沒有增加,這就沒 有保證原子性!你在買票APP上買了一張票,但是當你去坐車的時候,工作人員告訴你,沒有你的 信息,即磁盤上沒有保存你的信息,這就可能會給你帶來很大的損失,這就沒有保證持久性!王某 的帳上余額的變化,不可重復讀,使得銀行多次來人拜訪他,打擾了他的生活,就讓他很苦惱,這 就沒有保證隔離性!這三例都表明了原子性,持久性,隔離性都是為實現一致性服務的!!! 一致性:由用戶和MySQL共同決定!!!

總結

以上是生活随笔為你收集整理的MySQL事务详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。