【问题标题】:Test phantom-read and dirty-read in Springboot在 Spring Boot 中测试幻读和脏读
【发布时间】:2019-09-06 12:35:32
【问题描述】:

幻读和脏读是初学者最大的陷阱之一,但是可以通过设置事务的隔离级别来管理它们。

您可能会争辩说它们可以由 spring-boot 控制。所以没有必要进行测试。但据我所知,并非所有数据库都支持隔离级别。那么,我们如何在 springboot 的测试中模拟它们呢?

【问题讨论】:

  • 所以你想将隔离设置为 TRANSACTION_READ_UNCOMMITTED?
  • @SimonMartinelli 不,我想写一个测试来模拟幻读或脏读的问题。
  • 我不明白你想测试什么。你说:“幻读和脏读是初学者最大的陷阱之一”你为什么这么认为?恕我直言,这不是真的,因为您必须更改隔离级别。这不是初学者会做的事
  • @SimonMartinelli 这正是我这么说的原因,因为初学者并不了解它们。结果,他们以错误的方式开发他们的应用程序,这给他们带来了严重的问题。我知道您可以设置隔离级别,但我说的不是设置它,而是关于我们如何在测试中提供这样的情况发生并针对它测试我们的代码。
  • 如果不将隔离级别设置为 TRANSACTION_READ_UNCOMMITTED,就不可能进入这种情况。默认是 READ_COMMITED 然后你就没有这个问题了

标签: spring spring-boot testing spring-data


【解决方案1】:

我用JUnit5模拟了SpringBoot中的脏读、不可重复读、幻读、丢失更新。

测试结果如下

  1. SQL 服务器:
Isolation Level Dirty Read Unrepeatable Read Phantom Read Lost Update
DEFAULT not occur may occur may occur may occur
READ_UNCOMMITTED may occur may occur may occur may occur
READ_COMMITTED not occur may occur may occur may occur
REPEATABLE_READ not occur not occur may occur not occur
SERIALIZABLE not occur not occur not occur not occur
  1. MySQL
Isolation Level Dirty Read Unrepeatable Read Phantom Read Lost Update
DEFAULT not occur not occur may occur may occur
READ_UNCOMMITTED may occur may occur may occur may occur
READ_COMMITTED not occur may occur may occur may occur
REPEATABLE_READ not occur not occur may occur may occur
SERIALIZABLE not occur not occur not occur not occur
  1. PostgreSQL
Isolation Level Dirty Read Unrepeatable Read Phantom Read Lost Update
DEFAULT not occur may occur may occur may occur
READ_UNCOMMITTED not occur may occur may occur may occur
READ_COMMITTED not occur may occur may occur may occur
REPEATABLE_READ not occur not occur not occur not occur
SERIALIZABLE not occur not occur not occur not occur
  1. H2
Isolation Level Dirty Read Unrepeatable Read Phantom Read Lost Update
DEFAULT not occur may occur may occur may occur
READ_UNCOMMITTED may occur may occur may occur may occur
READ_COMMITTED not occur may occur may occur may occur
REPEATABLE_READ not occur not occur not occur may occur
SERIALIZABLE not occur not occur not occur may occur

JUnit5 测试示例

您可以在here参考这个项目。

【讨论】:

    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 2011-05-12
    • 2019-04-16
    • 2018-10-30
    • 2016-12-21
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多