当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,并且保证这些语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。
其中,银行转账这一事例,最能说明,使用事务的重要性了。
update from account set money=money-200 where name=‘a’;
update from account set money=money+200 where name=‘b’;
因为这时,两个账户的增减变化是在一起执行的。
针对JDBC处理事物的操作,在Connection接口中,提供了三个相关的方法:
> 1; setAutoCommit(boolean autoCommit) :设置是否自动提交事务
> 2; commit():提交事务
> 3; rollback():撤销事务
首先,.设置事务的提交方式为非自动提交:
conn.setAutoCommit(false);
接下来,.将需要添加事务的代码放入try,catch块中。
然后,.在try块内添加事务的提交操作,表示操作无异常,提交事务。
conn.commit();
尤其不要忘记,.在catch块内添加回滚事务,表示操作出现异常,撤销事务:
conn.rollback();
例子:
conn = JDBCUtils.getConnection();
// 控制事务,关闭事务的自动提交
conn.setAutoCommit(false);
// 账号转出200
String sql = "UPDATE account SET money = money-? WHERE "+ "name=? AND money>=200";
pstmt1 = conn.prepareStatement(sql);
// 设置参数
pstmt1.setDouble(1, amount);
pstmt1.setString(2, outAccount);
pstmt1.executeUpdate();
// 账号转入200
String sql2 = "update account set money=money+? where name=?";
pstmt2 = conn.prepareStatement(sql2);
pstmt2.setDouble(1, amount);
pstmt2.setString(2, inAccount);
pstmt2.executeUpdate();
// 提交事务
conn.commit();
System.out.println("转账成功");
} catch (Exception e) {
// 回滚事务
try {
conn.rollback();
System.out.println("转账失败");
} catch (SQLException e1) {
e1.printStackTrace();
}
}