gpt4 book ai didi

java - JDBC 事务未回滚 - setAutoCommit(false)

转载 作者:行者123 更新时间:2023-12-02 09:40:53 25 4
gpt4 key购买 nike

这是典型的项目结构,一旦用户登录到应用程序,就会创建数据库连接。

Login.java{

Creating DB Connection

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
java.sql.Connection conn = DriverManager.getConnection(url, strUserDB, strPasswordDB);
CustomSession customSession = new CustomSession();
customSession.setConnectionDB(conn);
}

CustomSession.java{
private Connection conDBConnection;
// getter, setter
}

SubmitAction{

method1(ActionMapping map,
ActionForm form, HttpServletRequest request,
HttpServletResponse response)

Connection conDB = null;
CustomSession customSession = null;

AService aservice = null;
BService bservice = null;
CService cservice = null;

HttpSession session = request.getSession(false);
try{
customSession = (Connection) session.getAttribute("customSession");
conDB = objOFSession.getDBConnection();
conDB.setAutoCommit(false);
aservice = new AService(conDB);
bservice = new BService(conDB);
cservice = new CService(conDB);

aservice.method2();
bservice.method3();
cservice.method4(); // Exception comes, and commit is never executed

conn.commit();

}catch(Exception e){
conDB.rollback();
}

每个服务(*aservice、bservice、cservice)通常没有数据库连接并执行存储过程。SP 就像执行选择、更新、插入操作。

query = conConnectionDB.prepareCall(strCommand);
query.execute();
query.close();
if(errCode != 0){
throw new Exception(errCode,errorDesc);
}

}

问题我可以看到存储过程返回 0 以外的错误代码,因此它进入我的 if 条件并引发异常。我正在捕获异常并调用 rollback(),但正如我所见,没有任何更改被回滚。我的交易继续进行。

我还验证了 SP 不包含提交语句。

Java 代码中的提交语句都不会被执行,因为会抛出异常。

我还在开始时设置了AutoCommit(false)

请告诉我如何进一步解决此问题。

最佳答案

引用自Oracle documentation

A database transaction consists of ...

...

One data definition language (DDL) statement

即发出 DDL 语句后,例如CREATE TABLE 语句之前完成的所有更改均已提交,ROLLBACK 对它们没有影响。

插图示例

SQL> insert into test(x) values(1);

1 row created.

SQL>
SQL> create table tmp (x number);

Table created.

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL> select * from test;

X
----------
1

关于java - JDBC 事务未回滚 - setAutoCommit(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57077166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com