JDBC更新数据与事务处理
在数据的更新的时候需要考虑到事务的原子性,就是一个事务中多个操作要么都成功要么都失败。
示例:SMITH给ALLEN转账
public class TestMysql3 {
public static void main(String[] args) {
try {
System.out.println(updateDeposit(200.00));
} catch (SQLException e) {
e.printStackTrace();
}
}
public static boolean updateDeposit(Double sum) throws SQLException {
// 取得连接对象
Connection conn = ConnectionUtils.getConnection();
// 定义sql语句
String sql1 = "UPDATE emp SET deposit=deposit-? WHERE ename='SMITH'";
String sql2 = "UPDATE emp SET deposit=deposit+? WHERE ename='ALLEN'";
// 取消事务自动提交
conn.setAutoCommit(false);
int row1 = 0;
int row2 = 0;
try {
// 取得预编译对象(发送sql语句对象)
PreparedStatement pst1 = conn.prepareStatement(sql1);
PreparedStatement pst2 = conn.prepareStatement(sql2);
//为占位符赋值
pst1.setDouble(1, sum);
pst2.setDouble(1, sum);
// 执行sql语句
row1 = pst1.executeUpdate();
row2 = pst2.executeUpdate();
// 以上的全部代码都执行成功才手动提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
// 如果出现异常则事务回滚
conn.rollback();
} finally {
//关闭连接
ConnectionUtils.close(conn);
}
return row1 > 0 && row2 > 0;
}
}