概述
名詞解釋
共享鎖(shared lock)
: 這種鎖允許事務對讀鎖定的對象進行讀取操作, 同時允許其他的事務也對這個對象施加共享鎖, 但是不能對鎖定的對象進行寫入, 共享鎖的反面是排它鎖.
排它鎖(exclusive lock)
: 一種可以防止其他事務鎖定同一行的鎖, 這種鎖可能會阻止其他事務寫入或者讀取鎖定的對象, 而InnoDB使用MVCC技術來實現對唄排它鎖鎖定的對象讀取來提高併發性.
一致性讀(consistent read)
: 利用快照snapshot
信息來根據某個時間點來讀取數據, 而不管其他事務對該對象做了什麼操作, 如果其他的事務已經完成操作, 則會通過撤銷日誌(undo log)來重建數據.
鎖定讀
: 在讀取的時候, 使用某種鎖鎖定需要讀取的數據.
# 使用共享鎖(Share Lock)鎖定
select * from t1 lock in share mode;
# 使用排它鎖(Exclusive Lock)鎖定
select * from t1 where id=1 lock for update;
非鎖定讀:
select * from t1 where id=1;
事務相關操作語句
# 查看當前MySQL數據庫版本
select version();
# 查看當前數據庫的隔離級別
SELECT @@tx_isolation;
# 設置隔離級別
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
# 開始事務
start transaction;
# begin也也是開啓一個事務
begin;
# 提交事務
commit;
# 回滾事務
rollback;
髒讀(Dirty Read)
:
現象
髒讀
: 事務A在操作某行數據, 此時事務B開始讀取數據, 然後事務A回滾事務, 此時事務B讀取到的數據就是髒數據
, 而事務B這種讀取到其他事務的中間數據的過程就是髒讀.
不可重複讀
: 事務A在開啓事務後,兩次讀取同一行, 發現返回不同的數據, 這種在一個事務中兩次讀取到不同數據的情況就是不可重複讀.
幻讀
: 事務A開始事務, 正在修改id爲1-50的數據, 當修改到40行時候, 再次讀取第一行數據, 發現第一行數據似乎沒有被修改, 其實它是在被事務A修改後又被其他事務改回來了, 似乎產生了幻覺, 這就是幻讀.
隔離級別
讀未提交(read uncommitted)
事務B能夠讀取到事務A還沒有提交的數據, 就是事務A未提交的中間數據能夠被事務B讀取到,
讀已提交
: 事務B只能夠讀取到事務A提交前或者提交後的數據, 不能讀取到事務A未提交的中間數據.每次都會讀取其他事務最新提交的快照.
可重複讀
: 事務B在還沒有提交前, 對鎖定的數據, 無論重複多少次讀取, 都是一樣的. 原因是在事務開始時候, 對對象採用了一致性讀取在該事務開始時候的快照.
可串行化
: 整張表, 一個時刻只能有一個事務在操作.
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read uncommitted) | ✔ | ✔ | ✔ |
讀已提交(read committed) | ✘ | ✔ | ✔ |
可重複讀(repeatable read) | ✘ | ✘ | ✔ |
可串行化(serializable) | ✘ | ✘ | ✘ |