如何锁定单行

问题描述 投票:0回答:5

我有一个

user
表,其中包含字段
lastusedecnumber

我需要访问并增加

lastusedecnumber

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

我该怎么做?

桌子类型是

MyISAM

mysql locking myisam
5个回答
27
投票

MySQL 仅使用 MyISAM 表的表级锁定。如果可以的话,切换到 InnoDB 进行行级锁定。

这里是 MySQL 站点的链接,描述了 SQL 语句为 InnoDB 表设置的锁。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html


6
投票

有点晚了,但希望对某人有帮助:

UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1);
SELECT LAST_INSERT_ID();

将为您提供lastusedecnumber的原子增量,并能够使用

lastusedecnumber
读取
SELECT LAST_INSERT_ID()
字段的新值(增量后)。


0
投票

作为一种解决方法,您可以在表中添加一列,例如

locked TINYINT(1)
- 每当您希望锁定该行时,请将其设置为
1
。当您现在尝试访问此行时,您要做的第一件事是检查
locked
字段是否已设置。

要解锁该行,只需再次将其设置为

0
即可。不太好,但是一个非常简单的解决方法。


0
投票

我不想将整个数据库从 myisam 转换。所以我只是尝试创建一个根据我想要锁定的记录的 id 命名的新表。如果创建表成功,则执行我的工作并在最后删除该表。如果建表不成功,则停止。


-2
投票

更好的解决方法是创建一个包含时间戳的列。每当您想要锁定该行时,您都可以将其更新为当前时间。要解锁,请更新到至少 x 分钟前的时间。然后检查时间戳是否已锁定,检查时间戳是否至少为 x 分钟。

这样,如果进程崩溃(或者用户从未完成其操作),锁定将在 x 分钟后有效过期。

© www.soinside.com 2019 - 2024. All rights reserved.