2011-06-15 29 views
1

如何鎖定空行?MYSQL - 鎖空行

我要鎖定一個空的選擇,例如:

會議1

mysql> begin; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select * from users where username = 'nousername' for update; 
Empty set (0.01 sec) 

mysql> 

會議2

mysql> begin; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select * from users where username = 'nousername' for update; 
Empty set (0.00 sec) 

mysql> 

我需要第二節等到會議1的結果前完成返回。

我該如何做到這一點?

謝謝?

回答

1

使用advisory lock

+0

謝謝,這應該工作。當有行時,沒有像FOR UPDATE這樣的方法? – keepwalking 2011-06-15 21:45:12

+0

當你確實有行時,'for update'工作。當你不這樣做的時候,你需要鎖定一個謂詞,而且我唯一的意思就是在MySQL中這樣做,這是諮詢鎖。 – 2011-06-16 09:21:29

1

有你有三種選擇,各有優點和缺點,我寧願選擇用於更新或LOCK TABLES:

1.諮詢鎖get_lock()由@Denis提到:

缺點:

  • 沒有得到清掉與提交,回滾,

  • 系統通用名稱,所以你應該實現自己的獨特的命名

優點:

  • 沒有清除現有的交易

  • 不會阻止其他查詢

2.表鎖lock tables

優點:

  • 沒有得到清除掉與提交,回滾,

  • 每個數據庫鎖

缺點:

  • 清除現有的交易

3。鎖定與僞表中選擇 - 而是具有特定選擇的,我用一般選擇select max(users_id) from users for update

優點:

  • 沒有逃脫被清除提交,回滾,

  • 每個數據庫鎖

  • 不清除現有交易

缺點:

  • 如果表是空的不工作(需要插入僞行,或者使用專用的表鎖)