1. 程式人生 > >mysql中 for update 使用

mysql中 for update 使用

for update是在資料庫中上鎖用的,可以為資料庫中的行上一個排它鎖。當一個事務的操作未完成時候,其他事務可以讀取但是不能寫入或更新。

例子:
比如一張表三個欄位 , id(商品id), name(商品名字) , count(數量) 
當商品搶購時候會顯示剩餘商品件數,如果併發量大的時候,商品自減的值可能不準確。所以當我們在一個事務中對count欄位進行修改的時候,其他事務應該只能讀取指定id的count,而不能進行update等操作。這個時候就需要用到for update.

sql語句:
start transaction ; 
select * from table_name where id =1 for update ;

update table_name set count = count - 1 where id= 1;

此時如果另一個事務也想執行類似的操作:
start transaction ; 
select * from table_name where id =1 for update ; 
//下面的這行sql會等待,直到上面的事務回滾或者commit才得到執行。 
update table_name set count = count - 1 where id= 1;

*注:當選中某一個行的時候,如果是通過主鍵id選中的。那麼這個時候是行級鎖。 
其他的行還是可以直接insert 或者update的。如果是通過其他的方式選中行,或者選中的條件不明確包含主鍵。這個時候會鎖表。其他的事務對該表的任意一行記錄都無法進行插入或者更新操作。只能讀取。*
 

那是一種行級鎖,一旦使用者對某個行施加了行級加鎖,則該使用者可以查詢也可以更新被加鎖的資料行,其它使用者只能查詢但不能更新被加鎖的資料行.如果其它使用者想更新該表中的資料行,則也必須對該表施加行級鎖.即使多個使用者對一個表均使用了共享更新,但也不允許兩個事務同時對一個表進行更新,真正對錶進行更新時,是以獨佔方式鎖表,一直到提交或復原該事務為止。行鎖永遠是獨佔方式鎖。
只有當出現如下之一的條件,便釋放共享更新鎖:
(1)、執行提交(COMMIT)語句;
(2)、退出資料庫(LOG OFF)

(3)、程式停止執行。

 

那麼,什麼時候需要使用for update?就是那些需要業務層面資料獨佔時,可以考慮使用for update。場景上,比如火車票訂票,在螢幕上顯示郵票,而真正進行出票時,需要重新確定一下這個資料沒有被其他客戶端修改。所以,在這個確認過程中,可以使用for update。這是統一的解決方案方案問題,需要前期有所準備