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

时间:2019-12-16 10:44:49

标签: amazon-web-services mysql-5.6 sqltransaction aws-aurora-serverless aws-rds-data-service

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

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

我正在将MySQL 5.6与InnoDB和默认的REPEATABLE READ隔离级别一起使用。

问题是,当我将RDS DataService beginTransaction与多个executeStatement(以及提供的transactionId)一起使用时。致电commitTransaction时,我最后没有得到完整的结果。

commitTransaction仅向我提供了{ transactionStatus: 'Transaction Committed' }

我不明白,不是应该使用提交事务处理功能来给我(在我的许多SELECT数据集中)的全部结果?

相反,即使使用transactionId,每个executeStatement也会返回我单独的结果……这种行为显然是不一致的。

1 个答案:

答案 0 :(得分:1)

在一个事务中使用SELECT,在中使用REPEATABLE READ,您应该看到相同的数据,而看不到其他事务进行的任何更改。是的,数据可以被其他事务修改,但是在事务中,您在视图上操作并且看不到更改。因此是一致的。

要确保在选择之间实际上没有更改任何数据,唯一的方法是锁定表/行,即使用SELECT FOR UPDATE锁定-事实并非如此。 事务应该简短/快速,并且锁定表/阻止更新,而长时间运行的selects链显然是不可行的。


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

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

使用隔离级别REPEATABLE READwhich btw Aurora Replicas for Aurora MySQL always use for operations on InnoDB tables),您可以在数据库的读取视图上进行操作,并且仅查看在事务BEGIN之前提交的数据。

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

通过比较,在事务隔离级别为READ COMMITTED的情况下,一个事务中的后续选择可能会看到不同的数据,这些数据是其他事务在它们之间提交的。