[英]Mysql innodb row lock doesn't work
我正在使用 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
谢谢
InnoDB 实现了标准的row-level locking
,其中有两种类型的锁, shared (S) locks
和exclusive (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
Mysql innodb 行锁不起作用
现在,我认为它的问题是你不应该使用transaction not started
的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.