我想使用2个select语句从两个表中进行选择。但是,在选择第一个表时,另一个用户可能会更改第二个表
如果隔离级别设置为可序列化,是否可以保证在选择第一个表时第二个表不会更改?
示例:
Select * from Burgers where ID = 299 -- returns 1 rows
Select * from BurgerIngredients where BurgerID = 299 -- returns many rows
如果在检索汉堡时汉堡成分可能会发生变化,我该怎样做才能确保成分保持不变直到它们被取回?
由于
答案 0 :(得分:1)
根据the documentation for 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服务器标记了这个问题。在这种情况下,the same principle holds如果您指定事务隔离级别SNAPSHOT
。