Java:回滚数据库更新?

时间:2010-01-25 03:39:28

标签: java mysql database transactions

我有三种方法可以将节点保存到数据库中。目前,除非所有写入都成功,否则这不会达到不提交更改的预期效果。

    conn.setAutoCommit(false);
    writeNodeTable(node, newNodeNID);
    writeContentTypeBoutTable(node, newNodeNID);
    writeTerms(node, newNodeNID);
    conn.commit();

如果在第二种或第三种方法中存在问题(例如抛出未捕获的异常),我想回滚所有更改。有什么方法可以使用交易来做到这一点吗?

这是一个这样的DB编写功能:

private void writeTerms(DrupalNode node, int newNodeNID) throws SQLException {
    String sql = "INSERT INTO term_node (nid, vid, tid) VALUES (?, ?, ?)";
    PreparedStatement prep = conn.prepareStatement(sql);
    prep.setInt(1, newNodeNID);
    prep.setInt(2, newNodeNID);

    String schoolName = termHelp.schoolOfAgainst(node.get(BoutField.against));
    prep.setString(3, schoolName);

    prep.execute();

    String fencerName = termHelp.fencerOfAgainst(node.get(BoutField.against));
    prep.setString(3, fencerName);
    prep.execute();
    prep.close();
}

2 个答案:

答案 0 :(得分:5)

Upul是正确的,您需要实施Connection.setAutoCommit(false)Connection.rollback()方法。您可能想要为每个事务尝试的一件事就是拥有这种流程:

Connection conn = null; // or have the connection sent in
try {
    conn = getConnection(username, password);
    conn.setAutoCommit(false);
    // do stuff with connection
    conn.commit();
} catch (SQLException sqle) {
    // handle error appropriately
    conn.rollback();
} finally {
    // cleanup
    conn.close(); // depends on when the connection was allocated
}

答案 1 :(得分:3)

您可以在rollback界面中使用Connection方法。 http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Connection.html#rollback()

此外,您必须将setAutoCommit设置为false并正确调用commitrollback方法。