设置serializable是否使2个select语句成为原子? (2个选项之间的表格没有变化)

时间:2013-09-21 00:51:06

标签: mysql sql sql-server sql-server-2008 sql-server-2005

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

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

示例:

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

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

如果在检索汉堡时汉堡成分可能会发生变化,我该怎样做才能确保成分保持不变直到它们被取回?

由于

1 个答案:

答案 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