MYSQL - 锁定空行

时间:2011-06-15 21:34:54

标签: mysql transactions

如何锁定空行?

我想锁定一个空的选择,例如:

第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>

我需要会话2等到会话1完成才返回结果。

我如何实现这一目标?

感谢?

2 个答案:

答案 0 :(得分:2)

你有三个选项,每个选项各有优缺点,我更喜欢选择更新或锁定表:

<强> 1。 @Denis提到的咨询锁get_lock()

缺点:

  • 不会通过提交,回滚,

  • 清除
  • 系统范围的名称,因此您应该实现自己独特的命名

的优点:

  • 不会清除现有交易

  • 不会阻止其他查询

<强> 2。表锁lock tables

专业人士:

  • 确实通过提交,回滚,

  • 清除
  • 每个数据库锁

缺点:

  • 清除现有交易

第3。使用伪选择锁定表格 - 使用常规选择select max(users_id) from users for update

,而不是具有特定选择

的优点:

  • 确实通过提交,回滚,

  • 清除
  • 每个数据库锁

  • 不会清除现有交易

缺点:

    如果table为空(,则需要插入伪行,或使用专用表进行锁定)
  • 不起作用。

答案 1 :(得分:1)

使用advisory lock