一、事務特性
1.原子性
事務是乙個原子操作單元,事務中包含的所有操作要麼都做,要麼都不做,沒有第三種情況。
2.一致性
事務操作前和操作後都必須滿足業務規則約束,比如說a向b轉賬,轉賬前和轉賬後ab兩個賬戶的總金額必須是一致的。
3.隔離性
隔離性是資料庫允許多個併發事務同時對資料進行讀寫的能力,隔離性可以防止事務併發執行時由於交叉執行導致資料不一致的問題。
4.永續性
事務完成後,對資料的修改是永久的,即使出現系統故障也不會丟失。
二、併發問題
1.更新丟失
當兩個事務選擇同一行,然後更新資料,由於每個事務都不知道其他事務的存在,就會發生丟失更新的問題,(你我同時讀取同一行資料,進行修改,你commit之後我也commit,那麼我的結果將會覆蓋掉你的結果)。
2.髒讀
乙個事務正在對一條記錄做修改,在這個事務提交之前,別的事務讀取到了這個事務修改之後的資料,也就是說,乙個事務讀取到了其他事務還沒有提交的資料,就叫做髒讀。
3.不可重複讀
乙個事務讀某條資料讀兩遍,讀到的是不一樣的資料,也就是說,乙個事務在進行中讀取到了其他事務對舊資料的修改結果,(比如說 我開乙個事務 修改某條資料 先查後改 執行修改動作的時候發現這條資料已經被別的事務刪掉了)
4.幻讀
乙個事務中,讀取到了其他事務新增的資料,彷彿出現了幻象。(幻讀與不可重複讀類似,不可重複讀是讀到了其他事務update/delete的結果,幻讀是讀到了其他事務insert的結果)
三、隔離級別
1.未提交讀(read-uncommitted)
在乙個事務中,可以讀取到其他事務未提交的資料變化,這種讀取其他會話還沒提交的事務,叫做髒讀現象,在生產環境中切勿使用。
2.已提交讀(read-committed)
在乙個事務中,可以讀取到其他事務已經提交的資料變化,這種讀取也就叫做不可重複讀,因為兩次同樣的查詢可能會得到不一樣的結果。
3.可重複讀(repetable-read)
mysql預設隔離級別,在乙個事務中,直到事務結束前,都可以反覆讀取到事務剛開始時看到的資料,並一直不會發生變化,避免了髒讀、不可重複讀現象,但是它還是無法解決幻讀問題。
4.可序列化(serializable)
這是最高的隔離級別,它強制事務序列執行,避免了前面說的幻讀現象,簡單來說,它會在讀取的每一行資料上都加鎖,所以可能會導致大量的超時和鎖爭用問題。
5.隔離級別一覽表
隔離級別
讀資料一致性
髒讀不可重複讀
幻讀未提交讀
最低級別,只保證不讀取物理上損壞的資料有有
有已提交讀
語句級無有有
可重複讀
事務級無無有
可序列化
最高端別,事務級無無
無隔離級別越嚴格,內部工作機制越複雜,較鬆散的隔離級別通常可以支援更高的併發。
四、個人分享
1.凡是涉及到表結構的語句,皆不受事務控制,嚴格的說,凡是ddl語句,都是自帶commit。比如create table 、alter table、truncate 等等
2.如果要確定出現了哪種併發問題,先查一下當前資料庫的隔離級別是什麼,再進行判斷。
--檢視當前資料庫的隔離級別
show variables like "%tx_isolation%"
mysql強隔離公升級 MySQL的四種隔離級別
什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之前到...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
mysql隔離級別驗證 mysql 隔離級別測試
1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...