2013-05-13 42 views
0

此表有两个字段,价格和金额。在Innodb中记录锁定,是否可以工作

我表演上选择了更新,其价格低于100(查询1)中的所有记录这个InnoDB表的查询。

  1. 虽然此查询是怎么回事,我希望能够在有价greather 100.这是一定的工作表中插入或更新行?

  2. 与此同时,我想保证任何试图更新或插入行的表格,其价格低于100将不会发生,直到(查询1)完成。这也是确定的吗?

  3. 如果我想在查询类型1的时候执行普通select *查询,并且问题2中的查询能够执行这些读操作,或者这些读操作是否必须等到锁关闭了吗?这一定是肯定的。编辑:我想这些选择将能够访问任何记录表

  4. 最后,指标得到这个工作的关键?还是会按原样工作?

非常感谢。

回答

1

如果你的表只有两个字段(价格和数量),这似乎是...坏。那里肯定应该有一些其他的标识符?

  1. 是的。 SELECT FOR UPDATE只锁定它选择的记录。

  2. 也许吧。根据您的transaction isolation mode,MySQL可能会锁定索引范围,以阻止插入到作为查询一部分进行扫描的范围中。

  3. 这取决于您使用的事务隔离模式。如果使用更高的隔离模式,锁定更新的行将阻止它们被读取,因为事务可能会或可能不会最终对其进行更改,具体取决于它是否已提交。有关详细信息,请参阅MySQL手册的“SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads”部分。

  4. 是的。第二部分提到的索引范围锁定取决于索引。无论如何,运行未索引的查询是一个糟糕的主意 - 避免它。

+0

关于第3点,那么有没有办法读取当前正在通过“SELECT FOR UPDATE”查询的记录?是的,请指教。该链接是信息性的,但我不知道该怎么做。感谢您的其他答案。 – 2013-05-13 15:45:37

+0

正如我所说的,这取决于您当前的[事务隔离模式](http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html)。 (基于某些信息,我在那里感到惊讶,我已经更新了其他一些观点。) – duskwuff 2013-05-13 16:07:45

+0

只是为了澄清,如果您的TX隔离级别为SERIALIZABLE或REPEATABLE-READ,则读取将被阻止,并且如果级别READ COMMITTED或READ UNCOMMITTED – 2013-05-13 16:22:46