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

标签 mysql select transactions

当我们不得不使用多个不同的SELECT查询从数据库中的不同位置获取数据时,如何确保它们与INSERT、UPDATE或DELETE等查询隔离开来,从而确保选择的数据与彼此之间没有变化?

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

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

1, 3, 5

或者:

2, 4, 8

3 update queries不断的切换值。如何确保我得到:

1, 3, 5

或者:

2, 4, 8

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

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

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

最佳答案

你问的是如何“一致”地读取数据库。此类事项由transaction isolation level决定。 .你要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(默认值)。

关于mysql - 如何确保几个 SELECT 是隔离的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28854741/

相关文章:

sql-server - 存储过程中的所有语句都是一个事务

mysql - 使用由两个连接读取和递增的计数器时如何避免竞争条件?

mysql - 选择 future 60 天内不会过期的数据

不同用户的php登录系统

mysql - 将 Access Pivot 查询转换为 Mysql

mysql - MySQL 中具有可变数量动态列的数据透视表(组键 = id 字段的值行)

SQL根据行信息连接不同的表

php - 使用 PHP SQL 在数据库中查找特定值

transactions - cakephp 1.3 中的事务

MySQL:在重复键更新时获取 results.insertId