亚洲AV无码乱码在线观看性色,免费无码又爽又刺激高潮视频,用你的指尖扰乱我下一部动漫,人妻AV中文系列,人妻熟妇女的欲乱系列

for update的作用和用法

時間:2020-09-09 16:46:15 類型:數(shù)據(jù)庫
字號:    

  一、for update定義

  for update是一種行級鎖,又叫排它鎖,一旦用戶對某個行施加了行級加鎖,則該用戶可以查詢也可以更新被加鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被加鎖的數(shù)據(jù)行.如果其它用戶想更新該表中的數(shù)據(jù)行,則也必須對該表施加行級鎖.即使多個用戶對一個表均使用了共享更新,但也不允許兩個事務(wù)同時對一個表進行更新,真正對表進行更新時,是以獨占方式鎖表,一直到提交或復(fù)原該事務(wù)為止。行鎖永遠是獨占方式鎖。

  只有當(dāng)出現(xiàn)如下之一的條件,才會釋放共享更新鎖:

  1、執(zhí)行提交(COMMIT)語句

  2、退出數(shù)據(jù)庫(LOG OFF)

  3、程序停止運行

  二、概念和用法

  通常情況下,select語句是不會對數(shù)據(jù)加鎖,妨礙影響其他的DML和DDL操作。同時,在多版本一致讀機制的支持下,select語句也不會被其他類型語句所阻礙。

  而select … for update 語句是我們經(jīng)常使用手工加鎖語句。在數(shù)據(jù)庫中執(zhí)行select … for update ,大家會發(fā)現(xiàn)會對數(shù)據(jù)庫中的表或某些行數(shù)據(jù)進行鎖表,在mysql中,如果查詢條件帶有主鍵,會鎖行數(shù)據(jù),如果沒有,會鎖表。

  由于InnoDB預(yù)設(shè)是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執(zhí)行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執(zhí)行Table Lock (將整個資料表單給鎖住)。

  舉個例子: 假設(shè)有張表user ,里面有 id 和 name 兩列,id是主鍵。

  例1: (明確指定主鍵,并且數(shù)據(jù)真實存在,row lock)

  SELECT * FROM user WHERE id=3 FOR UPDATE;SELECT * FROM user WHERE id=3 and name='Tom' FOR UPDATE;

  例2: (明確指定主鍵,但數(shù)據(jù)不存在,無lock)

  SELECT * FROM user WHERE id=0 FOR UPDATE;

  例3: (主鍵不明確,table lock)

  SELECT * FROM user WHERE id<>3 FOR UPDATE;SELECT * FROM user WHERE id LIKE '%3%' FOR UPDATE;

  例4: (無主鍵,table lock)

  SELECT * FROM user WHERE name='Tom' FOR UPDATE;

  注意:

  1、FOR UPDATE僅適用于InnoDB,且必須在事務(wù)處理模塊(BEGIN/COMMIT)中才能生效。

  2、要測試鎖定的狀況,可以利用MySQL的Command Mode(命令模式) ,開兩個視窗來做測試。

  3、Myisam 只支持表級鎖,InnerDB支持行級鎖 添加了(行級鎖/表級鎖)鎖的數(shù)據(jù)不能被其它事務(wù)再鎖定,也不被其它事務(wù)修改。是表級鎖時,不管是否查詢到記錄,都會鎖定表。

  三、什么時候需要使用for update?

  借助for update語句,我們可以在應(yīng)用程序的層面手工實現(xiàn)數(shù)據(jù)加鎖保護操作。就是那些需要業(yè)務(wù)層面數(shù)據(jù)獨占時,可以考慮使用for update。

  場景上,比如火車票訂票,在屏幕上顯示有票,而真正進行出票時,需要重新確定一下這個數(shù)據(jù)沒有被其他客戶端修改。所以,在這個確認(rèn)過程中,可以使用for update。

  四、for update悲觀鎖

  悲觀鎖:總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時候都認(rèn)為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻塞直到它解鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。就像for update,再比如Java里面的同步原語synchronized關(guān)鍵字的實現(xiàn)也是悲觀鎖。

  樂觀鎖:顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時候都認(rèn)為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫提供的類似于write_condition機制,其實都是提供的樂觀鎖。


<