這篇文章帶給大家的內容是關於MySQL中樂觀鎖和悲觀鎖的介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
資料庫管理系統中並發控制的任務是確保在多個交易同時存取資料庫中相同資料不會破壞交易的隔離性和統一性以及資料庫的統一性
樂觀鎖定與悲觀鎖定並發控制主要採用的技術手段
- # #在關聯式資料庫管理系統中,悲觀式並發控制(悲觀鎖,PCC)是一種並發控制的方法。它可以阻止一個事務以影響其他使用者的方式來修改資料。如果一個事務執行的操作的每行資料都套用了鎖,那麼只有當這個事務鎖釋放,其他事務才能夠執行與該鎖衝突的操作
MySQL教學)
要使用悲觀鎖定,必須關閉mysql資料庫的自動提交屬性,因為MySQL預設使用autocommit模式,也就是當你執行一個更新作業後,MySQL會立即將結果提交以上查詢語句中,使用了select...for update方式,透過開啟排他鎖的方式實現了悲觀鎖。則相應的記錄被鎖定,其他事務必須等本次事務提交之後才能夠執行
//开始事务 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會把數據給鎖定,不過我們需要注意一些鎖的級別,MySQL InnoDB預設行級鎖定。行級鎖定都是基於索引的,如果一條SQL用不到索引是不會使用行級鎖的,就會使用表級鎖定整張表鎖住。特點
##樂觀鎖相對悲觀鎖而言,是假設資料不會發生衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤訊息,讓使用者決定如何做
- #樂觀並發控制也是一種並發控制的方法。
- 假設多用戶並發的事務在處理時不會彼此互相影響,各事務能夠在不產生鎖的情況下處理各自影響的那部分數據,在提交數據更新之前,每個事務會先檢查在該事務讀取數據後,有沒其他事務修改該數據,如果有則回滾正在提交的事務
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中文網其他相關文章!