sha*_*nuo 5 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)
Run Code Online (Sandbox Code Playgroud)
在另一个窗口中,我启动了事务,并尝试对同一条记录进行更新锁定。
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)
Run Code Online (Sandbox Code Playgroud)
从上面的示例中可以看到,由于该事务正在窗口1中的另一个应用程序进行处理,因此我无法选择记录43秒钟。事务结束后,我必须选择记录,但是由于id首先执行的事务将2更改为id 3,未返回任何记录。
我的问题是使用“用于更新”语法的缺点是什么?如果我不提交在窗口1中运行的事务,记录将永远被锁定吗?
是的,如果事务 #1 没有提交,这些记录将被永远锁定,除非连接断开,或者 innodb 由于检测到死锁而决定回滚事务。
但由于先执行的事务将id 2更改为id 3,所以没有返回任何记录。
这不是你想要的吗?如果没有,那么你没有SELECT ... FOR UPDATE正确使用。请参阅http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
| 归档时间: |
|
| 查看次数: |
12316 次 |
| 最近记录: |