Java中的事务块?

时间:2016-04-19 02:54:26

标签: java transactions

在Java中执行事务的惯用方法是什么?我有一些代码

myObject oldVar = myVar.toMyObject();
myVar.mutationAndDBInsertion;
myObject newVar = myVar.toMyObject();

我想将这一切包装在一个事务块中,这样我确信除非数据库操作成功,myVar和{{1将是变异前后对象状态的准确表示。我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

提交交易

禁用自动提交模式后,在显式调用方法提交之前,不会提交任何SQL语句。在上一次调用方法提交之后执行的所有语句都包含在当前事务中,并作为一个单元一起提交。以下方法CoffeesTable.updateCoffeeSales(其中con是活动连接)说明了一个事务:

public void updateCoffeeSales(HashMap salesForWeek)     抛出SQLException {

PreparedStatement updateSales = null;
PreparedStatement updateTotal = null;

String updateString =
    "update " + dbName + ".COFFEES " +
    "set SALES = ? where COF_NAME = ?";

String updateStatement =
    "update " + dbName + ".COFFEES " +
    "set TOTAL = TOTAL + ? " +
    "where COF_NAME = ?";

try {
    con.setAutoCommit(false);
    updateSales = con.prepareStatement(updateString);
    updateTotal = con.prepareStatement(updateStatement);

    for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) {
        updateSales.setInt(1, e.getValue().intValue());
        updateSales.setString(2, e.getKey());
        updateSales.executeUpdate();
        updateTotal.setInt(1, e.getValue().intValue());
        updateTotal.setString(2, e.getKey());
        updateTotal.executeUpdate();
        con.commit();
    }
} catch (SQLException e ) {
    JDBCTutorialUtilities.printSQLException(e);
    if (con != null) {
        try {
            System.err.print("Transaction is being rolled back");
            con.rollback();
        } catch(SQLException excep) {
            JDBCTutorialUtilities.printSQLException(excep);
        }
    }
} finally {
    if (updateSales != null) {
        updateSales.close();
    }
    if (updateTotal != null) {
        updateTotal.close();
    }
    con.setAutoCommit(true);
}

}

来自ORACLE WEB Page的