如何确保几个 SELECT 是隔离的?

How to make sure several SELECTs are isolated?

当我们不得不使用几个不同的 SELECT 查询从数据库中的不同位置获取数据时,如何确保它们与 INSERT、UPDATE 或 DELETE 等查询隔离,以便我们可以确定所选数据是否一致,中间没有变化?

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

例如,3 SELECT 查询 return 3 个不同的值,或者:

1、3、5

或:

2、4、8

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

1、3、5

或:

2、4、8

但不能介于两者之间,例如:2、3、5,也不能是 2、4、5 等

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

那么,如果我将这 3 个 SELECT 放入交易中,它会起作用吗?

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

你问的是如何读取数据库"consistently"。此类事项由transaction isolation level. You want REPEATABLE READ:

决定

This is the default isolation level for InnoDB. For consistent reads, there is an important difference from the READ COMMITTED isolation level: All consistent reads within the same transaction read the snapshot established by the first read. This convention means that if you issue several plain (nonlocking) SELECT statements within the same transaction, these SELECT statements are consistent also with respect to each other. See Section 14.2.7.2, “Consistent Nonlocking Reads”.

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