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

How to achieve consistent read across multiple SELECT using AWS RDS DataService (Aurora Serverless)

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

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

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

问题是当我将 RDS DataService beginTransaction 与多个 executeStatement(使用提供的 transactionId)一起使用时。调用 commitTransaction.

时我最后没有得到完整的结果

commitTransaction只给我一个{ transactionStatus: 'Transaction Committed' }..

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

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

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

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


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

事务隔离会影响应如何处理同时发生的此事务和其他事务的影响。 Wikipedia

使用隔离级别 REPEATABLE READ (which btw Aurora Replicas for Aurora MySQL always use for operations on InnoDB tables),您对数据库的读取视图进行操作,并且只能看到在事务 BEGIN 之前提交的数据。

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

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