我不确定如何在多个SELECT
查询中实现一致的读取。
我需要运行几个SELECT
查询,并确保在它们之间不存在UPDATE
,DELETE
或者CREATE
已经改变了整体一致性。对我而言,最好的情况当然是不受阻碍的事情。
我正在将MySQL 5.6与InnoDB和默认REPEATABLE READ
隔离级别一起使用。
问题是当我将RDS DataServicebeginTransaction
与多个executeStatement
(带有提供的transactionId
)一起使用时。致电时,我最后没有得到完整的结果commitTransaction
。
该commitTransaction
只为我提供了一个{ transactionStatus: 'Transaction Committed' }
..
我不明白,不是应该通过提交事务处理功能来获取全部(全部SELECT
)数据集结果?
相反,即使有一个transactionId
,每个executeStatement
也都返回我单独的结果...这种行为显然是不一致的。
在与SELECT
s的一个事务中,REPEATABLE READ
您应该看到相同的数据,而看不到其他事务进行的任何更改。是的,数据可以被其他事务修改,但是在事务中,您在视图上操作并且看不到更改。因此,这是一致的。
要确保在选择之间没有实际更改任何数据,唯一的方法是锁定表/行,即用SELECT FOR UPDATE
-锁定,但事实并非如此。事务应该简短/快速,并且锁定表/阻止更新,而长时间运行的selects链显然不是一种选择。
针对数据库的已发布查询在发出时运行。查询结果将保持未提交状态,直到提交为止。如果查询的目标是另一个事务已获得锁定的资源,则可能会阻止查询。如果另一个事务修改资源导致冲突,查询可能会失败。
事务隔离影响应该如何处理此事务以及同时发生的其他事务的影响。维基百科
使用隔离级别REPEATABLE READ
(对于Aurora MySQL,Aurora副本始终用于InnoDB表操作)在数据库的读取视图上进行操作,并且仅查看BEGIN
事务处理之前提交的数据。
这意味着SELECT
即使在其他事务中进行了更改,在一个事务中的s也将看到相同的数据。
相比之下,在事务隔离级别READ COMMITTED
中,一个事务中的后续选择可能会看到不同的数据-其他事务在它们之间提交了这些数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句