2013-09-21 13 views
1

我想使用2选择语句从两个表中进行选择。但是当第一个表被选中时,另一个用户可能会更改第二个表设置serializable make 2 select语句是否原子化? (在2个选择之间的表格中没有变化)

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

例子:

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

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

如果在汉堡被检索BurgerIngredients可能会改变,我能做些什么,以确保原料保持不变,直到他们也被检索到的?

感谢

+0

不,它不能保证整个表都会被锁定。请显示选择语句。 –

+0

@Martin Smith我已经添加了这些示例。感谢您的评论 –

回答

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服务器的问题。在这种情况下,如果指定事务隔离级别SNAPSHOT,则the same principle holds