我不确定如何在多个SELECT
查询中实现一致的读取。
我需要运行几个SELECT
查询,并确保在它们之间,没有UPDATE
,DELETE
或CREATE
没有改变整体一致性。对我来说最好的情况当然是不受阻碍的东西。
我正在将MySQL 5.6与InnoDB和默认的REPEATABLE READ
隔离级别一起使用。
问题是,当我将RDS DataService beginTransaction
与多个executeStatement
(以及提供的transactionId
)一起使用时。致电commitTransaction
时,我最后没有得到完整的结果。
commitTransaction
仅向我提供了{ transactionStatus: 'Transaction Committed' }
。
我不明白,不是应该使用提交事务处理功能来给我(在我的许多SELECT
数据集中)的全部结果?
相反,即使使用transactionId
,每个executeStatement
也会返回我单独的结果……这种行为显然是不一致的。
答案 0 :(得分:1)
在一个事务中使用SELECT
,在中使用REPEATABLE READ
,您应该看到相同的数据,而看不到其他事务进行的任何更改。是的,数据可以被其他事务修改,但是在事务中,您在视图上操作并且看不到更改。因此是一致的。
要确保在选择之间实际上没有更改任何数据,唯一的方法是锁定表/行,即使用SELECT FOR UPDATE
锁定-事实并非如此。
事务应该简短/快速,并且锁定表/阻止更新,而长时间运行的selects链显然是不可行的。
对数据库发出的查询在发出查询时运行。查询结果将保持未提交状态,直到提交为止。如果查询的目标是另一个事务已获得锁定的资源,则可能会阻止查询。如果另一个事务修改资源导致冲突,查询可能会失败。
事务隔离影响应该如何处理此事务以及同时发生的其他事务的影响。 Wikipedia
使用隔离级别REPEATABLE READ
(which btw Aurora Replicas for Aurora MySQL always use for operations on InnoDB tables),您可以在数据库的读取视图上进行操作,并且仅查看在事务BEGIN
之前提交的数据。
这意味着即使一个事务中的SELECT
也可以看到相同的数据,即使其他事务进行了更改。
通过比较,在事务隔离级别为READ COMMITTED
的情况下,一个事务中的后续选择可能会看到不同的数据,这些数据是其他事务在它们之间提交的。