Java: откат обновления базы данных? - PullRequest
1 голос
/ 25 января 2010

У меня есть три метода, которые вместе сохраняют узел в базе данных. В настоящее время это не приводит к желаемому эффекту не фиксации изменений, если не все записи успешны.

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

Если во втором или третьем методе возникает проблема (например, возникает необработанное исключение), я бы хотел откатить все изменения. Есть ли способ использовать транзакции для этого?

Это одна из таких функций записи в БД:

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 ]

5 голосов
/ 25 января 2010

Упул правильно, вам нужно реализовать методы 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
}
3 голосов
/ 25 января 2010

Вы можете использовать метод rollback в интерфейсе Connection. http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Connection.html#rollback()

Также вы должны установить setAutoCommit в false и вызвать commit и rollback методы соответственно.

...