【发布时间】:2014-04-10 03:03:41
【问题描述】:
我将有多个客户将数据输入数据库,我必须确保事务不会混合。
我在文档中读到 START TRANSACTION 和 SELECT ... FOR UPDATE 会锁定它读取的每一行:
SELECT ... FOR UPDATE 读取最新的可用数据,在它读取的每一行上设置排他锁。因此,它设置的锁与搜索的 SQL UPDATE 在行上设置的锁相同。
见https://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
所以我登录了一个客户端并输入了以下语句:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 8 FOR UPDATE;
在此暂停第二个客户端条目....
UPDATE productMacAddress SET status='testing1' WHERE status='free' LIMIT 8;
COMMIT;
在另一个客户端,我输入:
START TRANSACTION;
SELECT * FROM productMacAddress WHERE status='free' limit 4 FOR UPDATE;
UPDATE productMacAddress SET status='testing2' WHERE status='free' LIMIT 4;
COMMIT;
但是在第一个客户完全完成之前,我无法SELECT 表中的任何内容。为什么会这样?文档说明它应该逐行锁定,特别是因为我LIMIT 8。
提前谢谢你。
【问题讨论】:
标签: mysql select transactions sql-update