如何确保几个SELECT被隔离?

时间:2015-03-04 12:39:01

标签: mysql select transactions

当我们必须使用几个不同的SELECT查询从数据库中的不同位置获取数据时,如何确保它们与INSERT,UPDATE或DELETE等查询隔离,以便我们可以确保所选数据与彼此之间并没有改变?

我知道我可以使用事务来实现INSERT,UPDATE和DELETE的相同效果,因此更改将作为一个整体应用。但是它也会隔离SELECT吗?

例如,3个SELECT查询返回3个不同的值:

1,3,5

或者:

2,4,8

3个更新查询不断切换值。如何确保我得到:

1,3,5

或者:

2,4,8

但两者之间没有任何东西,如:2,3,5,也不是2,4,5等。

我知道我可以在交易中获得这些更新,但我想要仔细检查。

如果我将这3个SELECT放在一个事务中,它会起作用吗?

2 个答案:

答案 0 :(得分:3)

您正在询问如何“始终如一”地阅读数据库。这些问题由transaction isolation level确定。你想要REPEATABLE READ

  

这是InnoDB的默认隔离级别。对于consistent reads,与READ COMMITTED隔离级别存在重要差异:同一事务中的所有一致性读取读取第一次读取建立的快照。此约定意味着如果在同一事务中发出多个普通(非锁定)SELECT语句,则这些SELECT语句也相互一致。请参阅Section 14.2.7.2, “Consistent Nonlocking Reads”

所以,是的,如果您将SELECT语句放在单个事务中,只要事务的隔离级别为REPEATABLE READ(默认值),它就会起作用。

答案 1 :(得分:1)

是。通常情况下,交易会阻止这种情况。查找dbms的事务隔离级别。以mysql为例,请参阅: http://dev.mysql.com/doc/refman/5.6/en/dynindex-isolevel.html 当然,更改所有三个值的更新语句必须在一个事务中。如果它们处于三个不同的事务中,那么您的select可以捕获更新之间的状态。