我有三种方法可以将节点保存到数据库中。目前,除非所有写入都成功,否则这不会达到不提交更改的预期效果。
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();
}
答案 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
并正确调用commit
和rollback
方法。