我有一个
user
表,其中包含字段 lastusedecnumber
。
我需要访问并增加
lastusedecnumber
。
在访问期间,我需要锁定该特定用户行(而不是整个表)。
我该怎么做?
桌子类型是
MyISAM
。
MySQL 仅使用 MyISAM 表的表级锁定。如果可以的话,切换到 InnoDB 进行行级锁定。
这里是 MySQL 站点的链接,描述了 SQL 语句为 InnoDB 表设置的锁。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
有点晚了,但希望对某人有帮助:
UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();
将为您提供lastusedecnumber的原子增量,并能够使用
lastusedecnumber
读取SELECT LAST_INSERT_ID()
字段的新值(增量后)。
作为一种解决方法,您可以在表中添加一列,例如
locked TINYINT(1)
- 每当您希望锁定该行时,请将其设置为 1
。当您现在尝试访问此行时,您要做的第一件事是检查 locked
字段是否已设置。
要解锁该行,只需再次将其设置为
0
即可。不太好,但是一个非常简单的解决方法。
我不想将整个数据库从 myisam 转换。所以我只是尝试创建一个根据我想要锁定的记录的 id 命名的新表。如果创建表成功,则执行我的工作并在最后删除该表。如果建表不成功,则停止。
更好的解决方法是创建一个包含时间戳的列。每当您想要锁定该行时,您都可以将其更新为当前时间。要解锁,请更新到至少 x 分钟前的时间。然后检查时间戳是否已锁定,检查时间戳是否至少为 x 分钟。
这样,如果进程崩溃(或者用户从未完成其操作),锁定将在 x 分钟后有效过期。