如何锁定单行

时间:2010-10-07 04:27:49

标签: mysql locking myisam

我有一个user表格,其中包含字段lastusedecnumber

我需要访问并增加lastusedecnumber

在访问期间,我需要锁定该特定用户行(而不是整个表)。

我该怎么做?

表格类型为MyISAM

5 个答案:

答案 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分钟后有效到期。