什么是事物
事物是应用程序中一系列操作,事物完成是指所有的操作都完成,事物不完成是指一个操作也不能完成,事物结束有两种情况,当事务中的所有步骤全部完成时,事务提交,如果一个步骤失败,则发生回滚操作,撤销之前所有的操作。
事物的四个特征
- 原子性:事物是数据库操作的逻辑工作单位,事物包含的操作要么全做,要么一个也不做。
- 一致性:事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
- 隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持续性:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务提交与回滚(commit与rollback)
commit:提交事务,会将磁盘缓存中的数据写入磁盘的数据库中,一般数据库是自动提交,因此修改以后数据库就会发生变化。
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);//关闭连接
}
}
后面会更新,关于异常抛不抛出对事物回滚的影响,及其操作方法。
代码之路何其漫长,且听我慢慢道来!!!