如何锁定一行

djmepvbi  于 2021-06-20  发布在  Mysql
关注(0)|答案(5)|浏览(304)

我有一个 user 带字段的表 lastusedecnumber .
我需要访问并增加 lastusedecnumber .
在访问期间,我需要锁定特定的用户行(而不是整个表)。
我该怎么做?
表类型为 MyISAM .

nmpmafwu

nmpmafwu1#

我不想从myisam转换我的整个数据库。因此,我只是尝试根据要锁定的记录的id创建一个名为的新表。如果create table成功,请执行我的工作并删除末尾的表。如果创建表不成功,请停止。

kdfy810k

kdfy810k2#

mysql只使用myisam表的表级锁定。如果可以,切换到innodb进行行级锁定。
这里有一个指向mysql站点的链接,描述了由innodb表的sql语句设置的锁。http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

ckx4rj1h

ckx4rj1h3#

有点晚了,但希望它能帮助别人:

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

将给你lastusedecnumber的原子增量和读取新值的能力 lastusedecnumber 字段(增量后)使用 SELECT LAST_INSERT_ID() .

vsdwdz23

vsdwdz234#

更好的解决方法是创建一个包含时间戳的列。无论何时要锁定该行,都会将其更新为当前时间。解锁更新到过去至少x分钟的时间。然后要检查其是否已锁定,请检查时间戳是否至少有x分钟。
这样,如果进程崩溃(或者用户从未完成操作),锁将在x分钟后有效地过期。

e0bqpujr

e0bqpujr5#

作为一种解决方法,您可以向表中添加一列,如 locked TINYINT(1) -无论何时要锁定行,都可以将其设置为 1 . 现在尝试访问此行时,首先要检查 locked 字段已设置。
要解锁该行,只需将其设置为 0 再一次。不是很好,但是一个非常简单的解决方法。

相关问题