在Java中执行事务的惯用方法是什么?我有一些代码
myObject oldVar = myVar.toMyObject();
myVar.mutationAndDBInsertion;
myObject newVar = myVar.toMyObject();
我想将这一切包装在一个事务块中,这样我确信除非数据库操作成功,myVar
和{{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的