【问题标题】:Callable or PreparedStatement and transactionsCallable 或 PreparedStatement 和事务
【发布时间】:2011-03-20 05:01:20
【问题描述】:

我在 java 中有一个准备好的语句调用,它调用一个提交或回滚 sybase 事务的过程。无论如何我可以从我的java调用中检查该事务的结果,即。提交成功还是回滚失败? 或者,我想检查程序是否完成且没有错误——最好的方法是什么? 谢谢

【问题讨论】:

  • "我在 java 中有一个准备好的语句调用,它调用一个过程" 你的意思是存储过程吗?

标签: java stored-procedures jdbc transactions


【解决方案1】:

我认为您使用了错误的方法。客户端(本例中为 JAVA 代码)应该提交或回滚,而不是 sybase 存储过程。我在这里假设“调用过程”是指提交或回滚的存储过程

如果您使用我刚才提到的方法,那么您可以将所有内容放在 try/catch 块中并相应地处理提交/回滚。

try {
    PreparedStatement ps = create prepared statement;
    ps.execute();

    // nothing went wrong, commit
} catch (SqlException e) {
    // something wen't wrong, rollback
}

如果“调用过程”是指另一个 JAVA 方法,那么我不知道为什么你会有一个单独的方法来执行提交或回滚,你可以在 try/catch 块中处理它如上所示。

【讨论】:

  • 在大铁世界中,存储过程管理自己的事务是很常见的,尤其是当这些过程从各种(编写错误的)客户端调用时。它可能不是 java 的方式,但绝不是“错误的方式”。
  • 好点,感谢您的评论。我想这取决于存储过程是否充当“客户端”,在这种情况下我会同意你的看法。但是如果JAVA代码是处理业务操作(插入tablex,从tabley中删除,全部作为1个工作单元等),我坚持我原来的答案,即客户端控制事务逻辑。您可以参考我给出的另一个答案 (stackoverflow.com/questions/3317390/…),我 100% 同意 Tom Kyte。
【解决方案2】:

如果回滚或提交发生在存储过程中,那么知道成功的唯一方法是让存储过程返回其成功状态。然后,Java 将有权访问此结果。

【讨论】:

  • “事务”发生在存储过程中,因此我将使用它的值返回到 java 代码。感谢您的帮助。
【解决方案3】:

存储过程应该返回某种状态或错误代码。
将其放入 OUT 参数中并从 proc 中读取。

     //Calling a stored procedure which takes in 2 parameters for addition
     /*
     --EXECUTE ADDITION 10,25,NULL
     ALTER PROCEDURE ADDITION
     @A INT
     , @B INT
     , @C INT OUT
     AS
     SELECT @C = @A + @B
     */
     CallableStatement cs2 = con.prepareCall("{call ADDITION(?,?,?)}");
     cs2.registerOutParameter(3,java.sql.Types.INTEGER);
     cs2.setInt(1,10);
     cs2.setInt(2,25);
     cs2.execute();
     int res = cs2.getInt(3);
     System.out.println(res);

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2012-10-08
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2010-10-23
    相关资源
    最近更新 更多