【问题标题】:MySql "For Update" results in ErrorMySql“更新”导致错误
【发布时间】:2013-06-12 12:57:26
【问题描述】:

一个新项目迫使我在处理更新时锁定了一个表。我遵循了我能找到的所有建议和指南,包括How to lock mysql tables in phphttp://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html,但我总是遇到同样的错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'LIMIT 0, 30' 附近使用正确的语法

为了避开我的活表中任何可能的恶魔,我在 INNODB 引擎上创建了一个新表进行测试,添加了唯一索引,插入了几行,并使用以下语法进行查询:

SELECT svalue FROM `test` WHERE skey='key2' for update;

这会产生相同的错误。从查询中删除 for update; 允许查询运行而不会出错。

我不确定我做错了什么,并且已经尝试了我能想到的一切。请帮助我了解我缺少什么!

谢谢

【问题讨论】:

  • 我遇到了同样的错误,即使将语句包装在事务中也是如此。我的服务器是 10.4.10-MariaDB

标签: mysql select sql-update


【解决方案1】:

在事务之外锁定几乎没有意义。这可能解释了语法错误。

顺便说一句,如果您只是想增加列的值(您的评论),只需直接更新它:

update tbl set col = col + 1 where ...

【讨论】:

  • 我遇到的问题是我需要知道 col 更新到的新值。我找不到像 Postgres 那样的“更新和返回值”语句。我试图遵循我的问题中列出的 dev.mysql.com 页面上的代码,它显示了这个例子:SELECT counter_field FROM child_codes FOR UPDATE;更新 child_codes SET counter_field = counter_field + 1;我是否需要将其包装在事务中,这是我的问题吗?
  • 是的,这很可能是问题所在。顺便说一句,如果您对 Postgres 有足够的了解,可以知道更新返回,那么您是否有特别的原因想要回到 MySQL 中? :-)
  • 不幸的是,MySQL 不是我在这个特定项目中的选择……总是感谢“现有的力量”。
【解决方案2】:

大多数时候,当您使用事务(InnoDB 类型)时,MySQL 会处理表或行锁定。

//Doing transactions
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$query = "SELECT svalue FROM `test` WHERE skey='key2'";

if($query)
{
  mysql_query("COMMIT");
}else{
  mysql_query("ROLLBACK");
}

【讨论】:

  • 我的目标是从表中选择一个现有值,然后递增并更新它,同时确保另一个进程在更新完成之前不会读取旧值。对于这种情况,我的大部分研究都指向“更新”,使用事务是否有优势?
  • @foxns7: op 锁定行实际上是正确的。并发事务可以修改它。
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多