5

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

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

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

问题是当我将 RDS DataServicebeginTransaction与多个executeStatement(提供的transactionId)一起使用时。打电话时我最后没有得到完整的结果commitTransaction

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

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

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

4

1 回答 1

1

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

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


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

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

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

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

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

于 2019-12-16T12:50:22.473 回答