我有一个 user 带字段的表 lastusedecnumber .我需要访问并增加 lastusedecnumber .在访问期间,我需要锁定特定的用户行(而不是整个表)。我该怎么做?表类型为 MyISAM .
user
lastusedecnumber
MyISAM
nmpmafwu1#
我不想从myisam转换我的整个数据库。因此,我只是尝试根据要锁定的记录的id创建一个名为的新表。如果create table成功,请执行我的工作并删除末尾的表。如果创建表不成功,请停止。
kdfy810k2#
mysql只使用myisam表的表级锁定。如果可以,切换到innodb进行行级锁定。这里有一个指向mysql站点的链接,描述了由innodb表的sql语句设置的锁。http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
ckx4rj1h3#
有点晚了,但希望它能帮助别人:
UPDATE user SET lastusedecnumber = LAST_INSERT_ID(lastusedecnumber + 1); SELECT LAST_INSERT_ID();
将给你lastusedecnumber的原子增量和读取新值的能力 lastusedecnumber 字段(增量后)使用 SELECT LAST_INSERT_ID() .
SELECT LAST_INSERT_ID()
vsdwdz234#
更好的解决方法是创建一个包含时间戳的列。无论何时要锁定该行,都会将其更新为当前时间。解锁更新到过去至少x分钟的时间。然后要检查其是否已锁定,请检查时间戳是否至少有x分钟。这样,如果进程崩溃(或者用户从未完成操作),锁将在x分钟后有效地过期。
e0bqpujr5#
作为一种解决方法,您可以向表中添加一列,如 locked TINYINT(1) -无论何时要锁定行,都可以将其设置为 1 . 现在尝试访问此行时,首先要检查 locked 字段已设置。要解锁该行,只需将其设置为 0 再一次。不是很好,但是一个非常简单的解决方法。
locked TINYINT(1)
1
locked
0
5条答案
按热度按时间nmpmafwu1#
我不想从myisam转换我的整个数据库。因此,我只是尝试根据要锁定的记录的id创建一个名为的新表。如果create table成功,请执行我的工作并删除末尾的表。如果创建表不成功,请停止。
kdfy810k2#
mysql只使用myisam表的表级锁定。如果可以,切换到innodb进行行级锁定。
这里有一个指向mysql站点的链接,描述了由innodb表的sql语句设置的锁。http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
ckx4rj1h3#
有点晚了,但希望它能帮助别人:
将给你lastusedecnumber的原子增量和读取新值的能力
lastusedecnumber
字段(增量后)使用SELECT LAST_INSERT_ID()
.vsdwdz234#
更好的解决方法是创建一个包含时间戳的列。无论何时要锁定该行,都会将其更新为当前时间。解锁更新到过去至少x分钟的时间。然后要检查其是否已锁定,请检查时间戳是否至少有x分钟。
这样,如果进程崩溃(或者用户从未完成操作),锁将在x分钟后有效地过期。
e0bqpujr5#
作为一种解决方法,您可以向表中添加一列,如
locked TINYINT(1)
-无论何时要锁定行,都可以将其设置为1
. 现在尝试访问此行时,首先要检查locked
字段已设置。要解锁该行,只需将其设置为
0
再一次。不是很好,但是一个非常简单的解决方法。