在java测试中调用存储过程后可以回滚吗?

时间:2017-09-05 09:33:11

标签: java oracle transactions

我在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对我的测试进行注释,但它没有帮助。
是否可以让我的测试回滚存储过程所做的所有更改?

1 个答案:

答案 0 :(得分:1)

这取决于存储过程。

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

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