如何使用 AWS RDS DataService (Aurora Serverless) 跨多个 SELECT 实现一致



我不确定如何在多个SELECT查询中实现一致的读取。

我需要运行几个SELECT查询,并确保它们之间没有UPDATEDELETECREATE改变整体一致性。对我来说,最好的情况当然是非阻塞。

我正在使用带有InnoDB的MySQL 5.6和默认REPEATABLE READ隔离级别。

问题是当我使用具有多个executeStatement的 RDS 数据服务beginTransaction(使用提供的transactionId(时。打电话给commitTransaction时,我最后没有得到完整的结果。

commitTransaction只为我提供了一个{ transactionStatus: 'Transaction Committed' }..

我不明白,提交事务不是应该给我整个(我的许多SELECT(数据集结果吗?

相反,即使有transactionId,每个executeStatement都给我返回个人结果......这种行为显然不一致。

在一个事务中使用SELECTREPEATABLE READ,您应该看到相同的数据,并且看不到其他事务所做的任何更改。是的,数据可以由其他事务修改,但是在事务中,您在视图上操作并且看不到更改。所以它是一致的。

为了确保在选择之间实际上没有数据更改,唯一的方法是锁定表/行,即使用SELECT FOR UPDATE- 但情况并非如此。 事务应该是短/快速的,锁定表/防止更新,而一些长时间运行的选择链显然不是一种选择。

针对

数据库发出的查询在发出查询时运行。查询的结果在提交之前将保持未提交状态。如果查询以另一个事务已获取锁定的资源为目标,则查询可能会被阻止。如果另一个事务修改了资源导致冲突,则查询可能会失败。

事务隔离会影响如何处理此事务和同时发生的其他事务的影响。维基百科

使用隔离级别REPEATABLE READ(顺便说一句,Aurora MySQL的Aurora Replicas始终用于对InnoDB表的操作(,您可以在数据库的读取视图上运行,并且仅查看在事务BEGIN之前提交的数据。

这意味着一个事务中的SELECT将看到相同的数据,即使其他事务进行了更改也是如此。

相比之下,使用事务隔离级别READ COMMITTED一个事务中的后续选择可能会看到不同的数据 - 这些数据是由其他事务在它们之间提交的。

最新更新