事務隔離級別主要是爲了數據庫的併發訪問而提出的。如果沒有事務隔離會出現哪些問題呢?
1)、更新丟失
假設兩個事務同時更新同一條數據,如果其中的一個事務出錯而退出,那麼會導致另一個事務也失敗。
2)、數據贓讀
一個事務執行了更新操作,但是並未提交。而此時其他事務讀取到該事務未提交的更新結果,則爲髒讀取。因爲更新操作的事務有可能發生錯誤而回滾不會提交事務。
3)、不可重複讀取
不可重複讀取體現的的問題是,同一個事務中兩次相同的查詢得到的結果不一致。因爲在兩次查詢中間可能有其他事務執行了影響該查詢結果的更新操作。
4)、幻讀
幻讀可以算是不可重複讀的特例,這裏主要是指結果集的總的行數不匹配。比如事務1的兩次查詢中間,事務2插入了可被事務1查詢條件檢索到的行,或者刪除相應的某一行。那麼事務1可能會出現,第二次查詢出來的結果有第一次查詢沒有的或者丟失了一些第一次查詢的結果。(這感覺就像幻覺一樣,命名一樣的查詢,第一次沒查出來的第二次咋就有了,真奇怪,所以叫幻讀)
爲了解決這些問題,MySQL實現了標準SQL中定義的四種事務隔離級別。
事務隔離級別 | 更新丟失 | 髒讀取 | 重複讀取 | 幻讀 |
READ UNCOMMITTED(未提交讀) | 不會 | 可能會 | 不可重複 | 可能會 |
READ COMMITTED(提交讀) | 不會 | 不會 | 不可重複 | 可能會 |
REPEATABLE READ(可重複讀) | 不會 | 不會 | 可重複 | 可能會 |
SERIALIZABLE(串行讀) | 不會 | 不會 | 可重複 | 不會 |
MySQL中修改事務隔離級別的方法:
- 修改mysql.ini文件
#可選級別有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
- 通過命令設置
#可選級別: <span style="font-family: Arial, Helvetica, sans-serif;">READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.</span>
set session transaction isolation level read committed;