1

我想使用 2 个选择语句从两个表中进行选择。但是在选择第一个表时,另一个用户可能会更改第二个表

如果隔离级别设置为可序列化,是否保证在选择第一个表时第二个表不会更改?

例子:

Select * from Burgers where ID = 299 -- returns 1 rows

Select * from BurgerIngredients where BurgerID = 299 -- returns many rows

如果在取回 Burger 时 BurgerIngredients 可能会发生变化,我能做些什么来确保配料在取回之前保持不变?

谢谢

4

1 回答 1

1

根据MySQL 的文档,是的。您只需要确保两者都是 InnoDB 表并且两个 SELECT 都发生在同一个事务中:

START TRANSACTION;
Select * from Burgers where ID = 299;
Select * from BurgerIngredients where BurgerID = 299;
COMMIT;

您不需要将隔离级别设置为SERIALIZABLE,默认值REPEATABLE READ就足够了。

同一事务中的所有一致性读取都会读取第一次读取建立的快照。这个约定意味着如果您在同一个事务中发出多个普通(非锁定)SELECT 语句,这些 SELECT 语句也相互一致。

请注意,这不会阻止其他进程写入表,只是该事务不会看到更改。

编辑:

现在我看到你也用 MS SQL 服务器标记了这个问题。在这种情况下,如果您指定事务隔离级别,同样的原则也成立SNAPSHOT

于 2013-09-21T01:20:15.437 回答