java 何时是强制性的?为@SqlConfig定义SqlConfig的每个值,

9gm1akwq  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(383)

关于Spring Framework Test,对于@SqlConfig annotation,它具有一些有价值的属性,例如:

  • dataSource:在可能的情况下定义一个显式的 dataSource。如果应用程序定义了2DataSources,其中一个有@Primary,但在Test类中需要第二个。
  • transactionManager:同上,因此必须根据次要的 dataSource - it选择 transactionManager,以保持同一对一起工作。* 如果我错了请纠正我 *

因此,@Service@Repository根据其@Transactional设置进行测试
这篇文章的原因是关于transactionMode属性,它通过SqlConfig.TransactionMode枚举工作,有三个值:

DEFAULT
INFERRED
ISOLATED

我读了javadoc,但不清楚何时使用 * 显式 * 其中任何一个,特别是最新的。

考虑因素

该应用程序,对于生产,将真正与当前的基础设施,根据 * 主要 * 和 * 次要 * 对DataSource s和TransactionManager s和@Transactional设置。* 因此,必须测试基础设施 *。

问题

  • 何时必须为SqlConfig.TransactionMode定义@SqlConfig的每个值?

为什么要使用替代配置来对抗 * 注意事项 * 部分中提到的预期和真实的配置?

mutmk8jj

mutmk8jj1#

理解Spring Framework中的@SqlConfig annotation的行为是至关重要的,特别是在测试执行期间涉及到事务管理时。具体来说,@SqlConfigtransactionMode属性控制在事务上下文中如何处理SQL脚本。下面是一个细分:

  1. DEFAULT:使用此设置,事务管理默认为框架的标准行为。简单地说,如果一个活动事务正在进行,SQL脚本将在其中执行。如果没有正在进行的事务,则在没有事务上下文的情况下处理脚本。
  2. INFERRED:当设置为INFERRED时,Spring尝试根据脚本中的某些关键字推断脚本的事务性质,如BEGINCOMMITCREATEALTER等。如果存在这样的关键字,Spring假设脚本管理自己的事务,因此在任何现有事务之外执行它。
  3. ISOLATED:在这种模式下,每个SQL脚本都被授予自己独特的事务,一旦脚本执行结束,这些事务就会被提交。当您希望一个脚本中的更改对后续脚本或测试立即可见时,这是一个有用的设置。
    所以,来回答你的问题:
  • transactionMode的选择取决于SQL脚本的行为及其与数据库的交互。如果您的脚本处理自己的事务,那么INFERREDISOLATED可能是合适的选择。否则,DEFAULT设置就足够了。
  • 至于在测试中使用与生产环境不同的配置,通常归结为实用性或必要性。在某些复杂的场景中,将每个脚本隔离在其自己的事务中可以提供更可靠的测试。还可能存在数据库或JDBC驱动程序行为需要偏离默认事务模式的情况。

然而,重要的是要记住,理想情况下,测试配置应该尽可能接近地反映生产设置。除非有令人信服的理由在测试中使用不同的事务模式,否则应该保留相同的配置以确保一致性和可靠性。

相关问题