0

该表有两个字段,价格和金额。

我正在对这个 innodb 表执行查询,该表选择更新价格小于 100 的所有记录(查询 1)。

  1. 在进行此查询时,我希望能够在表中插入或更新价格大于 100 的行。这确定有效吗?

  2. 同时,我想保证在(查询 1)完成之前,不会发生任何更新或向表中插入行的尝试,其价格小于 100。这也确定吗?

  3. 如果我想在类型 1 的查询和问题 2 中的查询发生时对该表执行普通的 select * from 查询,我是否能够进行这些读取,或者这些读取是否必须等到锁关闭?这必须确定。编辑:我希望这些选择能够访问表中的任何记录

  4. 最后,索引对于使其正常工作至关重要吗?还是会按原样工作?

非常感谢。

4

1 回答 1

1

如果您的表格只有两个字段(价格和金额),这看起来……很糟糕。当然那里应该有某种其他标识符吗?

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

  2. 也许。根据您的事务隔离模式,MySQL 可能会锁定索引范围以阻止插入到作为查询的一部分扫描的范围中。

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

  4. 是的。第 2 部分中提到的索引范围锁定取决于是否存在索引。无论如何,运行未索引的查询是一个坏主意——避免它。

于 2013-05-13T15:25:58.873 回答