mysql 並發控制

來源:互聯網
上載者:User

標籤:

1、多個線程同時修改資料,存在資料不一致的情況,也就是並發控制的問題。
2、mysql提供讀鎖和寫鎖,讀鎖之上可以再加讀鎖,不能加寫鎖,而寫鎖之上不能加任何鎖。也就是說,讀鎖是共用的,寫鎖是排他的。
3、鎖粒度,為了更好的並發控制,鎖的粒度應該儘可能小,也就是只鎖定修改的資料。但是,鎖本身也有一定的開銷,包括擷取鎖,檢查鎖是否釋放,釋放鎖,這些操作也耗費一定的資源。鎖的粒度小,在並發控制的時候,也就意味著需要更多的鎖,鎖的總開銷也就越大。
4、根據鎖的粒度,分為表鎖和行鎖,mysql本身使用表鎖來實現不同的目的,比如alter table,這個時候會忽略儲存引擎的鎖機制。儲存引擎支援表鎖和行鎖,不同儲存引擎的實現不同。
5、特別注意:mysql支援不同的交易隔離等級,隔離等級越高,鎖的粒度越大,也就是鎖的內容越多。比如:
考慮下面的情況,A,B用戶端的交易隔離等級都是read-uncommitted, 鎖的粒度是行鎖。
步驟一、A執行start transaction,修改一條記錄
步驟二、B執行start transaction,修改另一條記錄
二者是不阻塞的,證明read-uncommitted 是行鎖。同理,可以證明read-committed是行鎖,repeatable-read和serializable是表鎖。
6、死結,mysql在事務中,InnoDB會根據交易隔離等級自動鎖定,而釋放實在事務commit或者rollback的時候才釋放。這就會存在死結的情況,考慮下面的情況:
A,B用戶端的交易隔離等級都是read-uncommitted, 鎖的粒度是行鎖。
步驟一、A執行start transaction,修改記錄1
步驟二、B執行start transaction,修改記錄2
步驟三、A修改記錄2
步驟四、B修改記錄1
出現死結,不過mysql功能很強大,可以檢測出這種死結,B修改記錄1的時候報錯 ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting trans
action

mysql 並發控制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.