银行的转账业务(a转钱给b),原理上是修改表中的余额字段
Step1:从a 的余额中减掉响应的金额
Step2:给b的余额加上响应的金额
如果Step1和step2之间发生了异常 比如断电 ,地震等不可逆现象将会导致A的钱被扣了但是B的钱没有增加
这样显然不行
人们就会想一种办法 让Step1 和Step2 同时成功或者同时失败
这就产生了事务
事务具有原子性不可分割性 要么成功要么失败 不可能一件事情成功了 另一件事情失败了
那么在java中如何将2条或者2条以上的 dml 语句组合成一个事物呢?
(所谓dml语句既 插入,修改,删除 数据)
1:将自动提交关闭 (oracle默认的是自动提交事务)
Connection里面的 setAutoCommit(false) 设为false
2:写dml语句
3:抓异常
4:在异常里面回滚事物
Connection rollback();
代码如下:
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
Connection conn=null;
try {
//获得连接
conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");;
//设置不自动提交事物
conn.setAutoCommit(false);
//dm1语句1
PreparedStatement ps=conn.prepareStatement("update emp set sal=sal-1000 where ename=‘KING‘");
ps.executeUpdate();
//dm1语句2
PreparedStatement ps2=conn.prepareStatement("update emp set sal=sal+1000 where ename=‘SMITH‘");
ps2.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
try {
//回滚事物
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}catch(Exception e){
}
注意 事务 只能在同一链接中。