我不确定如何在多个 SELECT
之间实现一致读取查询。
我需要运行几个 SELECT
查询并确保它们之间没有 UPDATE
, DELETE
或 CREATE
改变了整体的一致性。对我来说最好的情况当然是非阻塞的。
我使用 MySQL 5.6 和 InnoDB 和默认 REPEATABLE READ
隔离级别。
问题是当我使用 RDS DataService beginTransaction
有几个 executeStatement
(使用提供的 transactionId
)。最后调用 commitTransaction
时我没有得到完整的结果.commitTransaction
只给我一个{ transactionStatus: 'Transaction Committed' }
..
我不明白,提交事务函数不应该给我整个(我的许多 SELECT
)数据集结果吗?
相反,即使使用 transactionId
, 每个 executeStatement
正在返回我个人的结果......这种行为显然不一致......
最佳答案
与 SELECT
一笔交易与 REPEATABLE READ
您应该会看到相同的数据 并且看不到其他交易所做的任何更改。是的,数据可以被其他事务修改,但是在事务中您在 View 上操作并且看不到更改。所以是一致的。
为了确保在选择之间没有实际更改数据,唯一的方法是锁定表/行,即使用 SELECT FOR UPDATE
- 但事实并非如此。
事务应该短/快并且锁定表/防止更新,而一些长时间运行的选择链显然不是一种选择。
对数据库发出查询 在发布时运行 .查询的结果将保持未提交,直到提交。如果查询的目标是另一个事务已获得锁定的资源,则查询可能会被阻止。如果另一个事务修改资源导致冲突,查询可能会失败。
事务隔离会影响如何处理此事务和同时发生的其他事务的影响。 Wikipedia
具有隔离级别 REPEATABLE READ
( which btw Aurora Replicas for Aurora MySQL always use for operations on InnoDB tables ) 对数据库的读取 View 进行操作,只看到 BEGIN
之前提交的数据的交易。
这意味着 SELECT
一个事务中的 s 将看到相同的数据,即使其他事务进行了更改。
相比之下,事务隔离级别 READ COMMITTED
一个事务中的后续选择可能会看到不同的数据——这些数据是由其他事务在它们之间提交的。
关于amazon-web-services - 如何使用 AWS RDS DataService (Aurora Serverless) 跨多个 SELECT 实现一致读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59355007/