Mysql更新

时间:2010-12-30 06:51:50

标签: mysql transactions sql-update

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中运行的事务,那么记录将永久锁定吗?

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