MySQL事物隔離級別

2021-09-02 20:26:03 字數 2299 閱讀 9930

mysql其實是分為server層和引擎層。

server層包括:聯結器、分析器、優化器、執行器、以及查詢快取。在這裡執行的一些mysql自己的一些邏輯,比如函式、儲存過程、檢視、觸發器,但是還沒有真正的去資料檔案中讀取資料。

引擎層:innodb、myisam、memory 負責資料的查詢和提取。

現在幾乎都用的innodb,因為只有它支援事物,它從 mysql 5.5.5 版本開始成為了預設儲存引擎。

設定引擎,在建表語句結尾設定 engine=innodb

查詢當前的事物隔離級別:show variables like 'transaction_isolation';

讀未提交:效率最高,最不安全的級別,會讀到別的事物未提交的資料。 會出現:髒讀、不可重複讀、幻讀。

讀提交:讀取別的事物提交的資料,mysql預設是這種隔離級別。 會出現:不可重複讀、幻讀。

可重複讀:事物開啟,那麼我無論讀一張表幾次,中間哪怕被別的事物插入新的資料或者刪除資料,我當前事物中也是看不到的。 會出現:幻讀。

序列化:對 一行/多行 資料加上"讀"、"寫"鎖,多個事物之間讀鎖之間不互斥,"寫"-"寫","寫"-"讀"都是互斥的。在執行增刪改操作時會先去獲取"寫"鎖,獲取到才能繼續執行事物。

將資料庫的事物隔離級別設定為讀未提交:set session transaction isolation level read uncommitted ;

會讀到別的事物未提交的資料。

髒讀:讀到別的事物未提交的資料。

比如a事物執行 insert into `t` (id,name) values(123,"aaa");

這時b事物執行 select * from `t`; 事物b這時看到的是有一條(123,"aaa")的資料。

a事物執行 rollback;

這時表`t`中是沒有這條(123,"aaa")的,所以事物b讀到了一條髒資料,如果拿著這條髒資料去做一些業務處理,那可能會導致一整條業務線上都出現這條髒資料。

將資料庫的事物隔離級別設定為讀提交:set session transaction isolation level read committed ;

可解決髒讀,只讀取別的事物 commit之後的資料。

不可重複讀:這種隔離級別會出現"不可重複讀",什麼是不可重複讀?我同乙個事物,讀一張表兩次,兩次資料不一樣。

設定隔離級別為"讀提交",開啟乙個事物,執行兩次select語句,中間被另乙個事物更新了這條資料,那麼兩次select出的結果不一致。

將資料庫的事物隔離級別設定為可重複讀提交:set session transaction isolation level repeatable read ;

在事物開啟後,**第一次執行sql的時候**會根據sql的查詢條件建立乙個檢視,在這個事物當中,一直會用當前檢視,資料中間被修改了,也不會影響到檢視中的資料。

所以,中間讀若干次,也不會導致結果不一致。注意,不是在事物開啟時建立檢視,而是在執行sql的時候建立檢視。

這種隔離級別適用的場景:某一天結束的時候需要對當天的帳進行清算,需要多次查詢這張表。

但是如果這時有新的交易記錄進來,那麼會導致流水不正常,這時可以用到可重複讀。

在當天結束的時候開啟事物並且執行sql,這時檢視生成了,再插入資料也是無影響的。

如果想開啟事物時就建立檢視,在開啟事務時 start transaction with consistent snapshot ;

可解決髒讀、不可重複讀。

幻讀:雖然看起來可重複讀不會讀到中途插入/更新/刪除的資料,但是這種會有一種幻覺,就是在事物開啟時是5條資料,事物結束後是6條資料。

將資料庫的事物隔離級別設定為可重複讀提交:set session transaction isolation level serializable ;

可解決髒讀、不可重複讀,幻讀。

設定隔離級別為序列化,開啟事物並執行sql,這時會將這條sql所走的索引的行進行上鎖。

如果sql中使用where id = 1;這種條件,另乙個事物的insert操作不會被阻塞,因為鎖住的是id索引=1的行。

但是如果使用的是 where aaa like "%asdasd";這種不會走索引的條件,預設掃瞄全表,那麼會鎖住全表,

這時的另乙個事物的insert操作會被阻塞,直到當前事物執行完成。這種效率最低。但是不會出現幻讀。

兩個事物之間操作的行有交集,且其中一方有寫操作,那麼會上鎖,互斥,直到某個事物執行完,第二個事物繼續執行。

mysql事物隔離級別

複習鞏固加深印象 一。事務 acid原子性,隔離性,一致性,永續性 二。事務隔離級別 通常併發事務處理 1 寫 寫,存在更新丟失問題 2 讀 寫,有隔離性問題,可能遇到髒讀,不可重複讀,幻讀 其中 1.髒讀 a事務讀到b未提交的資料 2.不可重複讀 a事務第二次讀時讀到了b事務提交的寫資料,可能導致...

mysql事物隔離級別

事物是區分檔案儲存系統與nosql資料庫重要特性之一,其存在的意義是為了保證即使在併發情況下也能正確的執行crud操作。怎樣才算是正確的呢?這時提出了事物需要保證的四個特性即acid a 原子性 atomicity c 一致性 consistency i 隔離性 isolation d 永續性 du...

MySQL 事物隔離級別

1.什麼是事物 訪問並可能更新資料庫的乙個完整的程式執行單元 unit 2 事物必須滿足acid特性 a,atomic,原子性,要麼都提交,要麼都失敗,不能一部分成功,一部分失敗。c,consistent,一致性,事物開始及結束後,資料的一致性約束沒有被破壞 i,isolation,隔離性,併發事物...