MySQL事務 隔離性中的隔離級別

2021-10-08 18:57:32 字數 2263 閱讀 6572

# 建表

create

table student (

id int

primary

key,

name varchar

(100))

engine

=innodb

charset

=utf8;

# 測試資料

insert

into student values(1

,'張三'

);

如果乙個事務讀到了另乙個未提交事務修改過的資料,那麼這種隔離級別就稱之為未提交讀:

上例中,session a和session b各開啟了乙個事務,session b中的事務先將id為1的記錄的列name更新為「李四」,然後session a中的事務再去查詢這條id為1的記錄,那麼在未提交讀的隔離級別下,查詢結果就是「李四」,也就是說某個事務讀到了另乙個未提交事務修改過的記錄。但是如果session b中的事務稍後進行了回滾,那麼 session a 中的事務相當於讀到了乙個不存在的資料,這種現象就稱之為髒讀,就像這個樣子:

髒讀違背了現實世界的業務含義,所以rn算是十分不安全的一種隔離級別。

如果乙個事務只能讀到另乙個已經提交的事務修改過的資料,並且其他事務每對該資料進行一次修改並提交後,該事務都能查詢得到最新值,那麼這種隔離級別就稱之為已提交讀:

從圖中可以看到,第4步時,由於session b中的事務尚未提交,所以session a中的事務查詢得到的結果只是「張三」,而第6步時,由於session b中的事務已經提交,所以session b中的事務查詢得到的結果就是「李四」了。對於某個處在在已提交讀隔離級別下的事務來說,只要其他事務修改了某個資料的值,並且之後提交了,那麼該事務就會讀到該資料的最新值,比方說:

我們在session b中提交了幾個隱式事務,這些事務都修改了id為1的記錄的列name的值,每次事務提交之後,session a中的事務都可以檢視到最新的值。這種現象也被稱之為不可重複讀。

一般資料庫的rr級別下,會出現幻讀。只能通過serializable隔離級別才能去避免幻讀。但是mysql中的rr級別下,可以解決幻讀問題。

在一些業務場景中,我們期望乙個事務只能讀到另乙個已經提交的事務修改過的資料,但是第一次讀過某條記錄後,即使其他事務修改了該記錄的值並且提交,該事務之後再讀該條記錄時,讀到的仍是第一次讀到的值,而不是每次都讀到不同的資料。那麼這種隔離級別就稱之為可重複讀。如圖所示:

從圖中可以看出來,session a中的事務在第一次讀取id為1的記錄時,列name的值為「張三」,之後雖然session b中隱式提交了多個事務,每個事務都修改了這條記錄,但是session a中的事務讀到的列name的值仍為「張三」,與第一次讀取的值是相同的。

以上3種隔離級別都允許對同一條記錄進行讀-讀讀-寫寫-讀的併發操作,如果我們不允許讀-寫寫-讀的併發操作,可以使用序列化隔離級別,示意圖如下:

如圖所示,當session b中的事務更新了id為1的記錄後,之後session a中的事務再去訪問這條記錄時就被卡住了,直到session b中的事務提交之後,session a中的事務才可以獲取到查詢結果。這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

資料庫的事務併發問題需要使用併發控制機制去解決,資料庫的併發控制機制有很多,最為常見的就是鎖機制。鎖機制一般會給競爭資源加鎖,阻塞讀或者寫操作來解決事務之間的競爭條件,最終保證事務的可序列化。

而mvcc則引入了另外一種併發控制,它讓讀寫操作互不阻塞,每乙個寫操作都會建立乙個新版本的資料,讀操作會從有限多個版本的資料中挑選乙個最合適的結果直接返回,由此解決了事務的競爭條件。

php mysql隔離 MySQL事務隔離級別

事務併發導致的問題是資料庫需要重點解決的問題,關於事務處理的技術都已經非常成熟了,四種隔離級別再加上乙個快照是所有資料庫 mysql commit query ok,0 rows affected 0.04 sec mysql select from innodb where name age fz...

mysql中事務的隔離性

msql中事務的五個屬性 1 原子性 乙個事務是乙個不可分割的工作單位,要木全都做了,要木全都不做了 2 一致性 事物執行前後,資料處於合法狀態 3 永續性 事物執行完畢後,資料就被持久修改 寫到磁碟中了 4 隔離性 多個事物併發執行的時候,事物之間不能相互干擾 而在隔離性不強的情況下會產生三個情況...

Mysql 事務隔離性

事務併發所引起的跟讀取資料有關的問題,各用一句話來描述一下 1.髒讀 事務 a 讀取了事務 b 未提交的資料,並在這個基礎上又做了其他操作。讀取未提交 2.不可重複讀 事務 a 讀取了事務 b 已提交的更改資料。讀取新提交update 3.幻讀 事務 a 受到事務 b 已提交的新增資料影響。看不到已...