【问题标题】:Using AbstractTransactionalJUnit4SpringContextTests with Oracle Procs which COMMIT将 AbstractTransactionalJUnit4SpringContextTests 与 COMMIT 的 Oracle Procs 一起使用
【发布时间】:2011-01-17 11:45:04
【问题描述】:

我正在使用 AbstractTransactionalJUnit4SpringContextTests 运行一个简单的测试:

public class MyTests extends AbstractTransactionalJUnit4SpringContextTests
{
    @Test
    public void simpleProcTest()
    {
        simpleJdbcTemplate.update("BEGIN p_dummy_commit; END;");
    }
}

提到的 proc 做了一个简单的表更新,然后是一个 COMMIT。

问题是,这个虚拟 proc 所做的更改并没有像我希望的那样回滚。

背景:我们有一个大型应用程序,它有很多执行此操作的过程,我正在尝试找出如何以回滚方式测试这些过程尽管它们包含显式 COMMIT 语句。

我希望利用事务嵌套功能,我想我可能会通过这个 Spring 超类“免费”获得它。不过我好像没有。

有人知道如何实现吗?

当我在 proc 之外执行直接 SQL UPDATE 时,我已确认回滚成功,因此我的 Spring 数据源和 transactionManager 看起来表现正常。

【问题讨论】:

    标签: java oracle spring testing junit


    【解决方案1】:

    Nested Transactions 可能是要走的路。

    显然(根据DataSourceTransactionManager 嵌套事务需要使用SavePoint 机制。如果我理解Oracle Docs 对,如果您的存储过程设置了保存点,您可能可以回滚外部事务。

    但是如何让 Spring 知道你的 SavePoint 是我无法理解的。可能您必须在 SQL 中显式调用它。

    【讨论】:

    • 我开始认为我的应用程序的许多嵌入式 COMMIT 语句将使任何简单的自动回滚机制变得不可能。正如您所提到的,Oracle 似乎确实为此目的使用了 SAVEPOINT,但我不知道替换所有这些显式提交是否会成为一种不幸的选择。
    【解决方案2】:

    我在离线时被告知,因为我们的 proc 充满了显式的 COMMIT 语句,所以我们无法轻松地执行 100% 干净的回滚。呸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2013-06-29
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多