一、事務隔離級別
1. READ UNCOMMITTED(讀未提交)
一個事務還沒提交時,它做的變更就能被別的事務看到。
2. READ COMMITTED (讀提交)
一個事務提交之後,它做的變更纔會被其他事務看到。
3. REPEATABLE READ (可重複讀)
一個事務執行過程中看到的數據,總是跟這個事務在啓動時看到的數據是一致的。當然在可重複讀隔離級別下,未提交變更對其他事務也是不可見的。
4. SERIALIZABLE(可串行化)
它是事務的最高隔離級別。對於同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”,當出現讀寫鎖衝突的時候,後訪問的事務必須等前一個事務執行完成,才能繼續執行。
實際應用中很少用,只有在非常需要確保數據一致性且可以接受沒有併發情況下,才考慮採用該級別。
二、隔離級別解決的問題
髒讀(dirty read):如果一個事務讀到了另一個未提交事務修改過的數據。
不可重複讀(non-repeatable read):如果一個事務只能讀到另一個已經提交的事務修改過的數據,並且其他事務每對該數據進行一次修改並提交後,該事務都能查詢得到最新值。
幻讀(phantom read):如果一個事務先根據某些條件查詢出一些記錄,之後另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來。
三、如何設置事務的隔離級別?
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;
四、如何啓動事務?
事務啓動一般是:
- 顯式啓動事務語句, begin 或 start transaction,配套的提交語句是commit,回滾語句是rollback。
- set autocommit=0,這個命令會將這個線程的自動提交關掉,意味着如果你只執行一個select語句,這個事務就啓動了,而且並不會自動提交。這個事務持續存在直到你主動執行commit 或 rollback 語句,或者斷開連接。