##什麼是Locking Reading## 說白了就是在query的同時對相應的數據進行鎖定,以便於保持事物的完整性mysql
##Locking Reading的兩種形式## SELECT ... LOCK IN SHARE MODE
: 在查詢的時候給數據加一個讀寫鎖。在事務提交前,其餘的事物只能讀取當前查詢出的數據,但不能修改sql
SELECT ... FOR UPDATE
:將讀數據的行爲判斷爲寫(UPDATE)行爲,其做用效果根據不一樣的隔離級別和有所不一樣。數據庫
##注意##測試
SELECT ... FOR UPDATE
只有在autocommit = 0 的時候才能生效##舉例## 一個簡單的例子,把數據從數據庫中取出加1再 存入。隔離級別爲默認的REPEATABLE READ。線程
START TRANSACTION; SELECT quantity FROM selectForUpdate WHERE id = 3 LIMIT 1 INTO @a; SET @a = @a + 1; UPDATE selectForUpdate SET quantity = @a WHERE id = 3; COMMIT;
使用mysql自帶的mysqlslat作30線程的測試,使用 SELECT * FROM testsql.selectForUpdate;
獲取結果。code
若是在SELECT語句中沒有 FOR UPDATE,最終的結果會隨機的變更,在我這裏是2或3。若是使用SELECT quantity FROM selectForUpdate WHERE id = 3 LIMIT 1 INTO @a FOR UPDATE;
,最終的結果爲 30事務