我有一个user
表格,其中包含字段lastusedecnumber
。
我需要访问并增加lastusedecnumber
。
在访问期间,我需要锁定该特定用户行(而不是整个表)。
我该怎么做?
表格类型为MyISAM
。
答案 0 :(得分:24)
MySQL仅使用MyISAM表中的表级锁定。如果可以,请切换到InnoDB以进行行级锁定。
这是一个指向MySQL站点的链接,该站点描述了由InnoDB表的SQL语句设置的锁。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
答案 1 :(得分:2)
有点迟到,但希望它会帮助某人:
UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();
将使用lastusedecnumber
给出lastusedecnumber的原子增量和读取SELECT LAST_INSERT_ID()
字段的新值(增量后)的能力。
答案 2 :(得分:1)
作为一种变通方法,您可以在表格中添加一列,例如locked TINYINT(1)
- 只要您想要锁定该行,就可以将其设置为1
。当您现在尝试访问此行时,首先要检查是否设置了locked
字段。
要解锁该行,只需将其再次设置为0
即可。不是很好,但是一个非常简单的解决方法。
答案 3 :(得分:0)
我不想从myisam转换整个数据库。所以我只是尝试创建一个基于我想要锁定的记录的id命名的新表。如果create table成功,请完成我的工作并删除最后的表。如果create table not successful,请停止。
答案 4 :(得分:-2)
更好的解决方法是创建包含时间戳的列。无论何时想要锁定行,都要将其更新为当前时间。解锁更新到过去至少x分钟的时间。然后检查它是否锁定检查时间戳至少是x分钟。
这样,如果进程崩溃(或者用户永远不会完成操作),则锁定会在x分钟后有效到期。