我不确定如何在多个SELECT
查询中实现一致的读取。
我需要运行几个SELECT
查询,并确保它们之间没有UPDATE
、DELETE
或CREATE
改变整体一致性。对我来说,最好的情况当然是非阻塞。
我正在使用带有InnoDB的MySQL 5.6和默认REPEATABLE READ
隔离级别。
问题是当我使用具有多个executeStatement
的 RDS 数据服务beginTransaction
(使用提供的transactionId
(时。打电话给commitTransaction
时,我最后没有得到完整的结果。
commitTransaction
只为我提供了一个{ transactionStatus: 'Transaction Committed' }
..
我不明白,提交事务不是应该给我整个(我的许多SELECT
(数据集结果吗?
相反,即使有transactionId
,每个executeStatement
都给我返回个人结果......这种行为显然不一致。
在一个事务中使用SELECT
REPEATABLE READ
,您应该看到相同的数据,并且看不到其他事务所做的任何更改。是的,数据可以由其他事务修改,但是在事务中,您在视图上操作并且看不到更改。所以它是一致的。
为了确保在选择之间实际上没有数据更改,唯一的方法是锁定表/行,即使用SELECT FOR UPDATE
- 但情况并非如此。 事务应该是短/快速的,锁定表/防止更新,而一些长时间运行的选择链显然不是一种选择。
数据库发出的查询在发出查询时运行。查询的结果在提交之前将保持未提交状态。如果查询以另一个事务已获取锁定的资源为目标,则查询可能会被阻止。如果另一个事务修改了资源导致冲突,则查询可能会失败。
事务隔离会影响如何处理此事务和同时发生的其他事务的影响。维基百科
使用隔离级别REPEATABLE READ
(顺便说一句,Aurora MySQL的Aurora Replicas始终用于对InnoDB表的操作(,您可以在数据库的读取视图上运行,并且仅查看在事务BEGIN
之前提交的数据。
这意味着一个事务中的SELECT
将看到相同的数据,即使其他事务进行了更改也是如此。
相比之下,使用事务隔离级别READ COMMITTED
一个事务中的后续选择可能会看到不同的数据 - 这些数据是由其他事务在它们之间提交的。