事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元
事务存在提交和回滚两种状态:
(1)commit:提交事务,会将磁盘缓存中的数据写入磁盘的数据库中,一般数据库是自动提交,因此修改以后数据库就会发生变化。
(2)rollback:数据回滚,将事务中已经执行成功的部分回到最初的状态。
案例:银行转账,a将100元转给b,存在两个对数据库更新的操作,首先更新a的金额减小100,之后将b的金额增加100。如果a金额减少以后,发送异常,则回滚,将a的金额回到初始状态。
代码:
public void testTransaction(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();//连接数据库
//连接,事务默认就是自动提交的。 关闭自动提交。
conn.setAutoCommit(false);//关闭自动提交事务
String sql = "update account set money = money - ? where id = ?";
ps = conn.prepareStatement(sql);
//扣钱, 扣ID为1 的100块钱
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();
int a = 10 /0 ;//异常发生部分
//加钱, 给ID为2 加100块钱
ps.setInt(1, -100);
ps.setInt(2, 2);
ps.executeUpdate();
//成功: 提交事务。
conn.commit();
} catch (SQLException e) {
try {
//事变: 回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps, rs);//关闭连接
}
}