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

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

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

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

我使用 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/

相关文章:

sql - 在 BEGIN/END TRANSACTION 内执行存储过程

python - 如何手动更改 IAM 角色凭证?

python - 如何在lambda中上传pandas、sqlalchemy包避免报错 "Unable to import module ' lambda_function' : No module named 'importlib_metadata' "?

mysql - "Convert to character set"不将仅具有整数列的表转换为指定的字符集

mysql - 为什么 "where not in"查询结果为 0

perl - 对 SQLite 数据库的仅内存修改

mysql - 在aws的ec2实例上部署war和安装mysql的步骤

ios - iOS Amazon Cognito登录错误InvalidParameterException

mysql - 为什么 Centos 上的 MySQL 5.6.38 打开文件描述符的数量如此之多?

c# - SQL 服务器 : is there any performance penalty for wrapping a SELECT query in a transaction?