我正在开发一个使用 Oracle 内置身份验证机制来管理用户帐户和密码的应用程序。该应用程序还使用行级安全性。基本上,通过应用程序注册的每个用户都会获得一个 Oracle 用户名和密码,而不是“USERS”表中的典型条目。用户还会收到某些表格上的标签。这种类型的功能要求在许多情况下将 DML 和 DDL 语句的执行结合起来,但这会带来一个问题,因为 DDL 语句执行隐式提交。如果在 DDL 语句执行后发生错误,事务管理不会回滚所有内容。例如,当新用户向系统注册时,可能会发生以下情况:
- 开始交易
- 将人员详细信息插入表中。(即名字、姓氏等)-DML
- 创建一个 oracle 帐户(创建由密码标识的用户 testuser;) -DDL 隐式提交。交易结束。
- 新交易开始。
- 执行更多 DML 语句(插入、更新等)。
- 发生错误,事务只回滚到第 4 步。
我了解上述逻辑按设计工作,但我发现很难对此类功能进行单元测试并在数据访问层对其进行管理。我让数据库关闭或在单元测试期间发生错误,导致测试模式被本应回滚的测试数据污染。发生这种情况时擦除测试模式很容易,但我担心生产环境中的数据库故障。我正在寻找管理这个的策略。
这是一个 Java/Spring 应用程序。Spring 提供事务管理。