【问题标题】:MySQL phpmyadmin - SELECT FOR UPDATE not recognisedMySQL phpmyadmin - SELECT FOR UPDATE 无法识别
【发布时间】:2018-03-27 21:41:24
【问题描述】:

我正在编写一个 PHP 程序,并希望实现行级锁定以避免用户同时更新/删除同一条记录。

但我在使用 SELECT FOR UPDATE 时遇到错误“无法识别的关键字”。表类型为 innoDB。

我是否缺少数据库的任何设置?

SELECT * FROM companyTable
WHERE companyId = "0000001"
FOR UPDATE;

错误
静态分析:

在分析过程中发现了 1 个错误。

无法识别的关键字。 (靠近位置 57 的“FOR”)
SQL 查询:文档

SELECT * FROM companyTable WHERE companyId = "0000001" FOR LIMIT 0, 30

MySQL 说:文档

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 30' at line 3

【问题讨论】:

  • 什么是FOR ??
  • SELECT [...] FOR UPDATE 是 Oracle 数据库语法而不是 MySQL 语法。

标签: mysql phpmyadmin row-level-security


【解决方案1】:

存在语法错误试试这个:

它选择从 1 到 30 的所有记录

SELECT * FROM companyTable WHERE companyId = "0000001" ORDER BY id LIMIT 30;

【讨论】:

  • 我正在尝试使用 SELECT FOR UPDATE 语句锁定记录/阻止其他用户执行 UPDATE/DELETE 操作。
【解决方案2】:

第一个问题似乎是,在您的 SQL 查询中缺少关键字 UPDATE

SELECT * FROM companyTable WHERE companyId = "0000001" FOR LIMIT 0, 30

第二个问题可能是,MySQL 中的 SELECT ... FOR UPDATE 语法不支持 LIMIT

所以你的 SQL 查询应该是:

SELECT * FROM companyTable WHERE companyId = "0000001" FOR UPDATE

在 phpmyadmin 中,很难删除自动添加的LIMIT 子句 - 尝试另一个 MySQL 客户端。

【讨论】:

    【解决方案3】:

    PhpMyAdmin 不是为处理(测试)事务控制而构建的,请改用 Mysql 控制台或 php 会话

    并在代码之前使用“begin”开始事务

    begin;
    
    select * from `tblx` where `idx`=1 for update;
    
    update `tblx` set `field`='xx' where `idx`=1;
    
    commit;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2017-04-06
      • 2011-05-17
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多