java - 对事务中需要的 DDL 语句进行单元测试

标签 java oracle unit-testing ddl dml

我正在开发一个使用 Oracle 内置身份验证机制来管理用户帐户和密码的应用程序。该应用程序还使用行级安全性。基本上,通过应用程序注册的每个用户都会获得 Oracle 用户名和密码,而不是“USERS”表中的典型条目。用户还会收到某些 table 上的标签。这种类型的功能要求在许多实例中组合执行 DML 和 DDL 语句,但这会带来问题,因为 DDL 语句执行隐式提交。如果执行 DDL 语句后发生错误,事务管理不会回滚所有内容。例如,当新用户在系统中注册时,可能会发生以下情况:

  1. 开始交易
  2. 将人员详细信息插入表格中。 (即名字、姓氏等)-DML
  3. 创建一个oracle帐户(创建由密码标识的用户testuser;) -DDL隐式提交。交易结束。
  4. 新交易开始。
  5. 执行更多 DML 语句(插入、更新等)。
  6. 发生错误,事务仅回滚至第 4 步。

我知道上述逻辑按照设计工作,但我发现很难对这种类型的功能进行单元测试并在数据访问层中对其进行管理。我在单元测试期间发生了数据库故障或错误,导致测试模式被本应回滚的测试数据污染。发生这种情况时,删除测试模式很容易,但我担心生产环境中的数据库故障。我正在寻找管理此问题的策略。

这是一个 Java/Spring 应用程序。 Spring提供事务管理。

最佳答案

首先我不得不说:这样做是个坏主意。有两个原因:

  1. 连接基于用户。这意味着您在很大程度上失去了连接池的好处。它的扩展性也不是很好。如果您同时有 10,000 个用户,您将不断打开和关闭硬连接(而不是软连接池);和
  2. 正如您所发现的,创建和删除用户是 DDL 而不是 DML,因此您会失去“事务性”。

不确定您为什么选择这样做,但我强烈建议您在应用程序而不是数据库层实现用户。

至于如何解决你的问题,基本上是不行的。与您在序列中间创建表或索引相同。

关于java - 对事务中需要的 DDL 语句进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892923/

相关文章:

java - 如何返回 PHP 数组并用 Java 接收它

java - 安卓Java : How do I update an object inside a method?

javascript - javascript CustomEvent 的 jasmine 单元测试

java - 销毁后创建JVM

c# - System.load(dll)在C#中的实现是什么?

javascript - Node-oracledb:只有最后一个值在循环中多次插入

sql - 将一行转置为多行 Oracle

sql-server - SSIS Oracle 提供商 OLEDB 连接器中的 Oracle Wallet 集成

node.js - 使用 Mocha 和 Sinon 在 Node JS 中测试 promise 回调

java - 数据库单元: Testing insert and update operations