多个插入事务中的脏读或幻读?

3
我理解维基百科隔离级别页面上给出的“脏读”和“幻读”的示例。但是,我不确定如何对以下情况进行分类以及应用哪种隔离级别或不同策略来避免这种情况。
  1. 事务1:在表A中插入行
  2. 事务2:选择表A中的行
  3. 事务2:根据先前的读取结果选择表B中的行
  4. 事务2:提交
  5. 事务1:在表B中插入行
  6. 事务1:提交
问题在于,在T1完成两个表的写入之前,T2会在B中选择某些内容。步骤3中的选择可能需要选择在5中插入的行才能正确执行。这是脏读、幻读还是其他情况?使用READ_COMMITTED隔离级别是否足以避免问题?据我所知,使用READ_COMMITTED时,T2不应在那一点上读取T1插入的新行。

在第4步中,你提交了什么?我没有看到交易2修改任何数据? - Kaivosukeltaja
@Kaivosukeltaja,由于只涉及SELECT操作,因此在T2上没有实际提交。我只是添加了它以显示该事务上没有更多的操作。我将编辑问题以使其更清晰明了。 - Cristian Vrabie
1个回答

1
这是一个“脏读取”。在“READ_COMMITTED”隔离级别下,步骤2中的查询不会返回您在步骤1中插入但尚未提交的行,从而防止访问尚未插入的数据的失败尝试。
“幻读”意味着在事务2中执行相同的查询两次,并获得不同的结果集。

只是为了确保:只有T2应该具有隔离级别READ_COMMITTED吗? T1的隔离级别是否相关?在某些地方,文档中说:“此级别禁止事务读取其中包含未提交更改的行”,这表明读取事务应具有READ_COMMITTED,而在其他地方,文档中说:“在此隔离级别中,DBMS实现保持写锁定”,这表明写入事务应该是具有READ_COMMITTED的那个。 - Cristian Vrabie
@CristianVrabie:应该为T2指定READ_COMMITTED,因为它会影响读取时的锁定行为。请参考此链接以获取示例:http://www.herongyang.com/MySQL/Transaction-Isolation-Level-Read-Uncommitted.html还要注意,在InnoDB中,默认的事务隔离级别是REPEATABLE READ,比READ COMMITTED更加隔离。 - Kaivosukeltaja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接