MySQL中樂觀鎖與悲觀鎖的介紹(程式碼範例)

不言
發布: 2019-02-01 10:21:16
轉載
3700 人瀏覽過

這篇文章帶給大家的內容是關於MySQL中樂觀鎖和悲觀鎖的介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

  • 資料庫管理系統中並發控制的任務是確保在多個交易同時存取資料庫中相同資料不會破壞交易的隔離性和統一性以及資料庫的統一性

  • 樂觀鎖定與悲觀鎖定並發控制主要採用的技術手段

#悲觀鎖定

  • # #在關聯式資料庫管理系統中,悲觀式並發控制(悲觀鎖,PCC)是一種並發控制的方法。它可以阻止一個事務以影響其他使用者的方式來修改資料。如果一個事務執行的操作的每行資料都套用了鎖,那麼只有當這個事務鎖釋放,其他事務才能夠執行與該鎖衝突的操作

  • 悲觀並發控制主要應用於資料爭用激烈的環境,以及發生並發衝突時使用鎖定保護資料的成本要低於回溯事務的成本環境

悲觀鎖,它指的是對資料被外界(包括本系統目前的其他事務,以及來自外部系統的事務處理)修改持保守態度(悲觀),因此在整個暑假處理過程中,將資料處於鎖定狀態。悲觀鎖定的實現,一般依賴資料庫提供的鎖定機制(推薦教學:

MySQL教學

  • 資料庫中,悲觀鎖的流程如下

    • 在對任何記錄進行修改之前,先嘗試為該記錄加上排他鎖定

    • 如果加鎖失敗,表示該記錄正在被修改,那麼當前查詢可能要等待或拋出異常

    • 如果成功加鎖,則可以對記錄做修改,事務完成後就會解鎖

    • #其間如果有其他對該記錄做修改或加排他鎖的操作,都會等待我們解鎖或直接拋出異常

MySQL InnoDB中使用悲觀鎖
要使用悲觀鎖定,必須關閉mysql資料庫的自動提交屬性,因為MySQL預設使用autocommit模式,也就是當你執行一個更新作業後,MySQL會立即將結果提交

//开始事务
begin;/begin work;/start transaction;(三者选一个)
select status from t_goods where id=1 for update;
//根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//修改商品status为2
update t_goods set status=2;
// 提交事务
commit;/commit work;
登入後複製
以上查詢語句中,使用了select...for update方式,透過開啟排他鎖的方式實現了悲觀鎖。則相應的記錄被鎖定,其他事務必須等本次事務提交之後才能夠執行

我們使用select ... for update會把數據給鎖定,不過我們需要注意一些鎖的級別,MySQL InnoDB預設行級鎖定。行級鎖定都是基於索引的,如果一條SQL用不到索引是不會使用行級鎖的,就會使用表級鎖定整張表鎖住。

特點
  • 為資料處理的安全性提供了保證

  • #效率上,由於處理加鎖的機制會讓資料庫產生額外開銷,增加產生死鎖機會

  • 在只讀型交易中由於不會產生衝突,也沒必要使用鎖,這樣會增加系統負載,降低並行性

樂觀鎖定

  • #樂觀並發控制也是一種並發控制的方法。

  • 假設多用戶並發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分數據,在提交數據更新之前,每個事務會先檢查在該事務讀取數據後,有沒其他事務修改該數據,如果有則回滾正在提交的事務

##樂觀鎖相對悲觀鎖而言,是假設資料不會發生衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤訊息,讓使用者決定如何做

    樂觀鎖定實作一般使用記錄版本號,為資料增加一個版本標識,當更新資料的時候對版本標識進行更新
  • 實作
使用版本號時,可以在資料初始化時指定一個版本號,每次對資料的更新操作都會對版本號執行1操作。並判斷目前版本號是不是該資料的最新版本號
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};
登入後複製

特點

樂觀並發控制相信事務之間的資料競爭機率是較小的,因此盡可能直接做下去,直到提交的時候才去鎖定,所以不會產生任何鎖和死鎖

以上是MySQL中樂觀鎖與悲觀鎖的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!