悲觀鎖
悲觀鎖,就是一種悲觀心態的鎖,每次訪問數據時都會鎖定數據:
樂觀鎖
樂觀鎖,就是一種樂觀心態的鎖,每次訪問數據時並不鎖定數據,期待數據並沒作修改,如果數據沒被修改則作具體的業務
應用程序上使用樂觀鎖的思想
MySQL的MVCC實現
多版本並發控制,MVCC
,Multi Version Concurrent Control
,用於實現非鎖定的讀操作。
MySQL的InnoDB的可重復讀隔離級別中是通過在每條記錄中加創建版本
和刪除版本
兩列來實現,這兩列的值是事務的版本號。
- Insert操作,
創建版本
為當前事務ID - Delete操作,
刪除版本
為當前事務ID - Update操作,原記錄的
刪除版本
為當前事務ID,新增一條更新后的記錄的創建版本
為當前事務ID
數據的樣式大概如下圖:
如果需要查詢某個事務版本的數據,邏輯如下SQL(只是用SQL表示此邏輯以便理解,內部並非這樣實現):
select * from table where 創建版本 <= 當前版本 and (刪除版本 is null or 刪除版本 > 當前版本);