Java 回滚()不';调用DML存储过程时是否在DB中还原数据?
我使用的是Java 8、MySQL 5.6、Tomcat 7(及其连接池)和MySQL J/Connector JDBC 5.1.35 我所做的是调用三到六个存储过程(大多数是纯DML,有些是SELECT语句)。我用Java 回滚()不';调用DML存储过程时是否在DB中还原数据?,java,mysql,jdbc,transactions,Java,Mysql,Jdbc,Transactions,我使用的是Java 8、MySQL 5.6、Tomcat 7(及其连接池)和MySQL J/Connector JDBC 5.1.35 我所做的是调用三到六个存储过程(大多数是纯DML,有些是SELECT语句)。我用prepareCall({调用存储过程的名称(?,,,,?)})设置它们。 我用executeQuery()执行其中两个,用executeUpdate()执行另一个 在调用commit()之前,将引发异常并调用rollback()。在这一点上,我本以为数据库表中的数据会被还原,但这并
prepareCall({调用存储过程的名称(?,,,,?)})设置它们。
我用executeQuery()
执行其中两个,用executeUpdate()执行另一个
在调用commit()
之前,将引发异常并调用rollback()
。在这一点上,我本以为数据库表中的数据会被还原,但这并没有发生!请注意,回滚期间未引发任何异常
正在执行的代码路径:
final Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/eukm");
Connection conn = ds.getConnection();
conn.setAutoCommit(false);
CallableStatement cs = conn.prepareCall("{call Store(?)}");
cs.setInt(1, 34);
ResultSet rs = cs.executeQuery();
rs.next();
int newId = rs.getInt(1);
rs.close();
cs.close();
cs = conn.prepareCall("{call Add(?, ?)}");
cs.setInt(1, 34);
cs.setInt(2, 1);
cs.executeUpdate();
cs.close();
conn.rollback();
conn.close();
一个可能的原因可能是存储的进程在其体内提交,而它们没有。至少,我没有看到任何COMMIT代码>代码中的s。不过,有些存储过程确实有两个单独的DML语句。这可能是个问题吗?打开数据库上的sql日志,看看发生了什么。可能是setAutocommit不起作用了,是他做的,并且设置了autocommit。然而,我也注意到我的很多表都在MyISAM引擎上(它不支持事务!)。所以这一定是回滚不起作用的原因。