MySQL支持“for update”关键字。以下是我测试它是如何工作的预期。我打开了2个浏览器选项卡,并在一个窗口中执行了以下命令。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
....
mysql> update myxml set id = 3 where id = 2 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.08 sec)
在另一个窗口中,我启动了事务并尝试在同一记录上进行更新锁定。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from myxml where id = 2 for update;
Empty set (43.81 sec)
从上面的示例中可以看出,我无法选择43秒的记录,因为事务正由Window No 1中的另一个应用程序处理。一旦事务结束,我必须选择记录,但是由于首先执行的事务将id 2更改为id 3,因此未返回任何记录。
我的问题是使用“for update”语法有什么缺点?如果我不提交在窗口1中运行的事务,那么记录将永久锁定吗?
答案 0 :(得分:3)
是的,如果事务#1没有提交,那么这些记录将永久锁定,除非连接断开,或者innodb决定由于死锁检测而回滚事务。
但是因为id 2被改为id 3 通过执行的事务 首先,没有记录被退回。
这不是你想要的吗?如果没有,那么你没有正确使用SELECT ... FOR UPDATE
。见http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html