MySQL中的Lock Reading

##什麼是Locking Reading## 說白了就是在query的同時對相應的數據進行鎖定,以便於保持事物的完整性mysql

##Locking Reading的兩種形式## SELECT ... LOCK IN SHARE MODE: 在查詢的時候給數據加一個讀寫鎖。在事務提交前,其餘的事物只能讀取當前查詢出的數據,但不能修改sql

SELECT ... FOR UPDATE:將讀數據的行爲判斷爲寫(UPDATE)行爲,其做用效果根據不一樣的隔離級別和有所不一樣。數據庫

##注意##測試

  1. SELECT ... FOR UPDATE只有在autocommit = 0 的時候才能生效
  2. 只能適用於支持ACID的數據引擎,如InnoDB

##舉例## 一個簡單的例子,把數據從數據庫中取出加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事務

相關文章
相關標籤/搜索