2

我正在开发一个项目,它执行以下操作:

  1. 截断临时表 T1。
  2. 将几千行插入临时表 T1。
  3. 执行一个包含一些提交语句的过程。
  4. 将表 T1 中的行插入其他相同的表(相对于结构) T2。
  5. 再执行 2 个带有 commit 语句的过程。

以上 5 个步骤对我来说是一笔交易。因此,要么全部完成,要么都不应该完成。

现在即使我执行 conn.rollback 如果发生一些错误,也很少有更改反映到数据库中。

程序中的提交语句是原因吗?截断表是否隐式提交到数据库?

如果是 ?有什么可能的解决方案?

提前致谢 !!!

PN:数据库在 oracle 中,我对 PL/SQL 的了解较少

4

1 回答 1

4

截断表(或执行任何其他 DDL 语句)会在执行语句之前和之后导致隐式提交。在您的程序中提交也将终止您的交易。

如果您真的希望所有这些步骤成为单个事务的一部分,则需要删除TRUNCATE(您确定您真的需要全局临时表吗?)并commit从您的过程中删除语句。一般来说,存储过程不应该包​​含事务控制语句,正是因为这个原因——如果你希望你的事务包含多个不同的调用,那么重用它们就变得非常困难。

于 2013-08-22T08:00:16.210 回答