MySQL事務以及加鎖機制
事務的特徵ACID,即原子性、一致性、隔離性、持久性。
原子性保證一個事務為一個最小的單元,內部不可分割;
一致性保證事務中的每個操作線程不可單獨提交,成功則一起提交,不成功則交易回復;
隔離性保證不同事務間看到的資料檢視相互獨立,相互隔離(隔離等級可設定);
持久性保證事務提交後資料會持久的儲存下來;
sql規範定義的事務的隔離等級:
1.READ UNCOMMITTED(讀取未提交內容)
所有事務可以看到未提交事務的執行結果,本隔離等級很少用到實際應用中,讀取未提交的資料,又稱為“髒讀”。
2.READ COMMITTED(讀取提交內容)
大多數資料庫的預設隔離等級是此層級,但不是mysql預設的。一個事務在開始的時候只能看見已提交事務所做的改變。一個事務從開始到提交前所做的任何改變都是不可見的,除非提交。這種隔離等級也稱為不可重複讀取。
3.REPEATABLE READ(可重複讀)
鎖定查詢中使用的所有資料以防止其他使用者更新資料,但是其他使用者可以將新的幻像行插入資料集,且幻像行包括在當前事務的後續讀取中。此層級也稱為“幻讀”。
4.SERIALIZABLE(可序列化)
可序列化是最高的隔離等級,它通過強制事務排序,使之不可重讀,解決了幻讀的問題。此隔離等級會在每個讀的資料行上加共用鎖定,使用這種隔離等級會產生大量的逾時現象,一般實際開發中不會用到。
mysql加鎖機制 :
根據類型可分為共用鎖定(SHARED LOCK)和獨佔鎖定(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由儲存引擎實現。
mysql提供了3種事務型儲存引擎,InnDB、NDB Cluster和Falcon。
一個事務執行的任何過程中都可以獲得鎖,但是只有事務提交或復原的時候才釋放這些鎖。這些都是隱式鎖定,也可以顯式鎖定,InnoDB支援顯式鎖定,例如:
SELECT .... LOCK IN SHARE MODE (加共用鎖定)
SELECT .....FOR UPDATE(加獨佔鎖定)
多版本並發控制(重要):
Mysql的事務儲存引擎不是簡單實用行加鎖機制,而是叫多版本並發控制(MVCC)技術,和行加鎖機制關聯實用。以便應對更高的並發,當然是以消耗效能作為代價。
每種儲存引擎對MVCC的實現方式不同,InnoDB引擎的簡單實現方式如下:
InnoDB通過為每個資料航增加兩個隱含值的方式來實現。這兩個隱含值記錄了行的建立時間,以及到期時間。每一行儲存事件發生時的系統版本號碼。每一次開始一個新事務時版本號碼會自動加1,每個事務都會儲存開始時的版本號碼,每個查詢根據事務的版本號碼來查詢結果。
--------------------------------------分割線 --------------------------------------
Ubuntu 14.04下安裝MySQL
《MySQL權威指南(原書第2版)》清晰中文掃描版 PDF
Ubuntu 14.04 LTS 安裝 LNMP Nginx\PHP5 (PHP-FPM)\MySQL
Ubuntu 14.04下搭建MySQL主從伺服器
Ubuntu 12.04 LTS 構建高可用分布式 MySQL 叢集
Ubuntu 12.04下原始碼安裝MySQL5.6以及Python-MySQLdb
MySQL-5.5.38通用二進位安裝
--------------------------------------分割線 --------------------------------------
本文永久更新連結地址: