【问题标题】:Can I rollback after calling stored procedure in java test?在java测试中调用存储过程后我可以回滚吗?
【发布时间】:2018-02-13 13:16:22
【问题描述】:

我在 DAO 层有调用 Oracle 数据库中存储过程的方法:

@Override
public void deleteNode(Integer nodeId) {
    SqlParameterSource in = new MapSqlParameterSource()
            .addValue("nodeId",nodeId)
            .addValue("user", "DUMMY");

    SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(ebDataSource)
            .withSchemaName("SCHEMA")
            .withCatalogName("PK_GRAPH_DML")
            .withProcedureName("DeleteNode");

    simpleJdbcCall.execute(in);
}

我必须测试这个方法。但我想在每次执行此测试后回滚所有更改。

@Test
@Transactional
@Rollback
public void deleteEBNode_ok() {
    Integer nodeId = 5714;

    ebFlowService.deleteEBNode(nodeId.toString());

    EBFlowToolSelect nodeModelFromDatabase = ebFlowService.getNodeById(nodeId);
    Assert.assertNull(nodeModelFromDatabase.getNodeId());
}

我尝试用 @Transactional@Rollback 注释我的测试,但没有帮助。
是否可以让我的测试回滚存储过程所做的所有更改?

【问题讨论】:

  • 这取决于存储过程。如果它管理自己的事务,则您无能为力,否则它应该参与事务,并且测试方法上的 @Transactional 应该是您所需要的。

标签: java oracle transactions


【解决方案1】:

这取决于存储过程。

  • 如果存储过程包含COMMIT statement,那么您将只能回滚在此语句之后执行的任何操作。
  • 如果存储过程是autonomous transaction,那么它将独立于您的事务(并包含自己的COMMIT 语句)并且您不能回滚它。

如果存储过程不包含COMMIT 语句并且不是自治的,那么您应该能够回滚它。

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多