有些情況下為了保證數據邏輯的一致性,需要對SELECT的操作加鎖。InnoDB存儲引擎對於SELECT語句支持兩種一致性的鎖定讀(locking read)操作。
1、 SELECT …… FOR UPDATE 2、 SELECT …… LOCK IN SHARE MODE
其中,SELECT …… FOR UPDATE對讀取的記錄加一個鎖,其他事務不能對已鎖定的行加任何鎖。而SELECT …… LOCK IN SHARE MODE也是對讀取的記錄加一個鎖。
但是如果有另一個一致性非鎖定讀的操作來讀取該行那么數據是不會阻塞的,讀取的是改行的快照版本(也就是指改行之前的數據版本,也就會出現臟讀,所以也稱為非鎖定讀,因為不需要等待被訪問行的鎖的釋放。非鎖定讀的方式極大提高了數據庫的並發性。在InnoDB存儲引擎中,這是默認的讀取方式)
SELECT …… FOR UPDATE和SELECT …… LOCK IN SHARE MODE必須在一個事務中,當一個事務提交了,鎖就釋放了。因此在使用這兩個SELECT鎖定語句時,必須開啟事務。