mysql數據庫臟讀解決方案,數據庫事務臟讀、幻讀、不可重復讀的解決方法
mysql數據庫臟讀解決方案,數據庫事務臟讀、幻讀、不可重復讀的解決方法
概念
-
臟讀:臟讀又稱無效數據的讀出,是指在數據庫訪問中,事務T1將某一值修改,然后事務T2讀取該值,此后T1因為某種原因撤銷對該值的修改,這就導致了T2所讀取到的數據是無效的。
-
幻讀:
幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那么,以后就會發生操作第一個事務的用戶發現表中還存在沒有修改的數據行,就好象發生了幻覺一樣。 -
不可重復讀:
事務A首先讀取了一條數據,然后執行邏輯的時候,事務B將這條數據改變了,然后事務A再次讀取的時候,發現數據不匹配了,就是所謂的不可重復讀了。 -
mysql數據庫臟讀解決方案。丟失的修改:
兩個事務同時修改同一行數據并提交,其中一個事務覆蓋了另一事務的修改。
解決方法
以上出現的都是數據庫事務隔離級別的問題,SQL標準定義了事務隔離級別分為四種(級別遞減):
-
Serializable (串行化):最嚴格的級別,事務串行執行,資源消耗最大;簡言之,它是在每個讀的數據行上加上共享鎖,但可能導致大量的超市現象和鎖競爭。
-
REPEATABLE READ(可重復讀) :保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但不能避免“幻讀”,但是帶來了更多的性能損失。
-
數據庫臟讀怎么解決,READ COMMITTED (提交讀):大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個并行事務已修改但未提交的數據,避免了“臟讀取”,但不能避免“幻讀”和“不可重復讀取”。該級別適用于大多數系統。
-
Read Uncommitted(未提交讀) :事務中的修改,即使沒有提交,其他事務也可以看得到,會導致“臟讀”、“幻讀”和“不可重復讀取”。
隔離級別 | 臟讀 | 幻讀 | 不可重復讀 |
---|---|---|---|
Read Uncommitted(未提交讀) | 可能 | 可能 | 可能 |
Read Commited (已提交讀) | 不可能 | 可能 | 可能 |
Repeatable Read(可重復讀) | 不可能 | 可能 | 不可能 |
Serializable (串行化) | 不可能 | 不可能 | 不可能 |
修改Mysql的事務隔離級別
# 修改配置文件
cd /etc/mysql/mysql.conf.d/
sudo vim mysqld.cnf# 添加以下代碼
transaction-isolation=READ-COMMITTED
在Oracle,SqlServer中都是選擇讀已提交(Read Commited)作為默認的隔離級別,而Mysql卻選擇可重復讀(Repeatable Read)作為默認隔離級別