MySQL隔離級別(幻讀)

2021-10-14 04:14:27 字數 2584 閱讀 3388

mysql 事務的基本了解

acid

1:事務的概念

什麼是事務呢?事務是指單個邏輯單元完成一些列操作,它要麼全部執行成功,要麼就失敗。事務處理可確保只有事務單元的操作。否則就不會擁有永久面向資料的更新資源,乙個邏輯工作單元要想成為事務,那麼他就必須要擁有事務的特性。

2:事務的用途

事務主要處理大量操作且資料複雜度比較高。這裡舉乙個生活中常見例子,比如銀行轉賬等。

3:acid的特性

1:原子性

乙個事務中的所有操作,他必須要具有原子性,在這個事務的執行過程中,它要麼全部執行成功,要麼就失敗。而不會停留在某個環節。事務在執行過程中,他會被rollback到事務的執行狀態。

2:一致性

事務在操作前後,資料庫的完整都不會進行破壞。

3:隔離性

同一時間,只是允許乙個事務對一條的進行操作。不同事務之間的操作是互不受影響的。

4:永續性

在事務操作完成後,對物理層面的影響是永久的,事務commit後,它會把所有的操作更新都會儲存到資料庫中的。且不能進行rollback。

事物隔離級別

讀未提交(read uncommitted):即使乙個事務的更新語句沒有提交,但是別的事務可以讀到這個改變。會導致以上幾種異常情況都可能出現,極易出錯,沒有安全性可言,基本不會使用。

讀已提交(read committed):乙個事務只能看到其他事務的已經提交的更新,看不到未提交的更新,這是大多數資料庫的預設隔離級別,如oracle,sqlserver。

可重複讀(repeatable read):乙個事務中進行兩次或多次相同的資料庫讀操作,得到的結果是一樣的。這是mysql資料庫的預設隔離級別。

序列化(serializable):事務執行的時候不允許別的事務併發執行,而是完全序列化的讀,只要存在讀就禁止寫,但可以同時讀,消除了幻讀。這是事務隔離的最高端別,雖然最安全,但是效率太低,一般不會用。

而mysql的隔離級別為可重複讀。

原子性 永續性 一致性都是通過資料庫的redo log(重做日誌,用來保證原子性和永續性)和undo log(回滾日誌,事務的一致性)去完成的。而事物的隔離性則是通過mysql自身的鎖機制去完成。
我們這裡先隨便建立乙個表

create

table t_demo(

id int(11

)not

null

, d int(11

)default

null

, d_1 int(11

)default

null

,primary

key(

`id`),

key`d_1`

(`d_1`))

;insert

into t_demo values(0

,0,0

),(1

,1,1

),(2

,2,2

),(3

,3,3

),(4

,4,4

),(5

,5,5

);

比如:

sql:select

*from name where id =

5for

update;

#提交commit

;

然而我們執行這個語句後,就問題來了

當我們這個事務提交後,是鎖住id為5的記錄,還是鎖住了這個表的資料呢?

不妨,我們來測試一下。

假如我們自定義id為5的,當只是鎖住id為5的記錄

select

*from test where id =

5for

update

;#結果

(5,5,5)

update t_demo set d_1 =

5where id =0;

#結果(0,

0,5)

(5,5

,5)insert

into t_demo values(6

,6,5

);select

*from t_demo where d_1=

5for

update;(

0,0,

5)(5

,5,5

)(6,

6,5)

當事務進行操作的時候,我們上面查詢的是id為5的資料。當我們使用鎖定讀的時候看一看到其他的資料。因此這一情況是幻讀。

解決幻讀的方案,我們可以設定事務的自動提交;

#首先先檢視事物的隔離級別

select @@tx_isolation

;#然後設定自動提交

set autocommit;

mysql事務隔離級別及幻讀

一 事務的基本特性 acid 1.原子性 atomicity 事務中的所有操作要麼全部生效,要麼全部不生效。事務如果執行過程中報錯,會將所有的操作回滾。也就是事務中的所有操作是乙個整體,就像化學中學過的院子,是構成物質的基本單位。2.一致性 consistency 事務開始前和事務結束後,資料處於一...

mysql事務隔離級別幻讀的解釋

不可重複度和幻讀區別 不可重複讀的重點是修改,幻讀的重點在於新增或者刪除。例1 同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了 事務1中的a先生讀取自己的工資為 1000的操作還沒完成,事務2中的b先生就修改了a的工資為2000,導 致a再讀自己的工資時工資變為 2000 這就是不可重複讀。...

MySQL事務隔離級別以及髒讀 幻讀 不可重複讀

事務的隔離性 mysql是乙個客戶端 伺服器架構的軟體,對於同乙個伺服器來說,可以有若干個客戶端與之連線,每個客戶端與伺服器連線上之後,就可以稱之為乙個會話 session 每個客戶端都可以在自己的會話中向伺服器發出請求語句,乙個請求語句可能是某個事務的一部分,也就是對於伺服器來說可能同時處理多個事...