【问题标题】:PL/SQL and JDBC Commits: Does writing commit in PL/SQL commits to database even if i do conn.rollback in jdbc?PL/SQL 和 JDBC 提交:即使我在 jdbc 中执行 conn.rollback,在 PL/SQL 中写入提交是否会提交到数据库?
【发布时间】:2013-08-24 20:10:06
【问题描述】:

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

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

对我来说,以上 5 个步骤构成了一笔交易。所以要么全部完成,要么都不做。

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

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

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

提前致谢!!!

P.N. : 数据库在 oracle 中,我对 PL/SQL 了解较少

【问题讨论】:

  • 如果您从另一个客户端调用过程,调用客户端应该有提交或回滚,而不是存储过程,因此您将拥有对事务的绝对控制权。
  • 所以我必须从我的程序中删除提交语句。我会这样做的
  • 截断语句怎么样。那些是DDL。我认为即使我不承诺,他们也会承诺。如果我错了,请纠正我!
  • 是的 TRUNCATE 通过提交所有以前的事务来进行提交。
  • 如果您想要事务处理,请使用 DELETE 而不是 TRUNCATE。

标签: oracle stored-procedures jdbc plsql


【解决方案1】:

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

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

【讨论】:

  • 如果我的后端开发人员知道这一点就好了:/。我花了两天时间说服他们。我在向他们解释同样的事情。发布这个问题只是为了确认我是否正确。因为我对 PL/SQL 了解较少。正是我需要的那种答案:)
  • 从 DUAL 中选择“TRUNCATE TABLE BD_BIDS_APPR_DET”到 V_SQL1;立即执行 V_SQL1; .立即执行是否执行隐式提交?
  • @AbhishekSingh - EXECUTE IMMEDIATE 不执行隐式提交。执行 DDL(这需要在存储过程中使用动态 SQL)。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多