Mysql innodb行锁不起作用

时间:2014-04-08 03:33:59

标签: mysql locking innodb rows

我使用的是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 

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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