【问题标题】:Mysql innodb row lock doesn't workMysql innodb 行锁不起作用
【发布时间】:2014-04-08 03:33:59
【问题描述】:

我正在使用 mysql v5.6。

当我使用 php 发送以下 mysql 查询时,它将选择一些行也锁定它们:

SELECT * FROM accounts WHERE id = 1 FOR UPDATE;

我收到以下错误消息:

#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, 25' at line 2 

谢谢

【问题讨论】:

  • 错误信息是关于 LIMIT 中的错误,而您显示的查询中没有 LIMIT,所以请显示原始查询

标签: mysql locking innodb rows


【解决方案1】:

Mysql innodb 行锁不起作用

现在,我认为它的问题是你不应该使用只会有很大不同的transaction not started,所以你应该像我的代码一样使用START TRANSACTION,并且

有时在运行transaction 时会发生这种情况,两个相同的语句得到不同的值,因为其他一些事务修改了表的行。

如下所示:

transaction1> START TRANSACTION;
transaction1> SELECT * FROM accounts WHERE id=1 FOR UPDATE;

例如:

transaction1> SELECT first_name, last_name FROM customer WHERE id = 3 FOR UPDATE;

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| JMAIL      | KRISH     |
+------------+-----------+

1 row in set (0.00 sec)

你应该参考这个链接:

http://www.mysqlperformanceblog.com/2012/03/27/innodbs-gap-locks/

http://dev.mysql.com/doc/refman/5.1/en/innodb-locks-set.html

https://stackoverflow.com/a/22007412/3242978

【讨论】:

    【解决方案2】:

    InnoDB 实现标准 row-level locking,其中有两种类型的锁,shared (S) locksexclusive (X) locks

    A shared (S) lock permits a transaction to read a row. An exclusive (X) lock permits a transaction to update or delete a row.

    使用SELECT FOR UPDATE 锁定行以进行更新仅适用于禁用autocommit 时(通过使用START TRANSACTION 开始事务或将autocommit 设置为0。如果启用自动提交,则符合规范的行未锁定。

    参考链接

    https://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

    https://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2011-10-03
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多