JDBC 事务
如果多个操作被视为一个整体,一起成功,一起失败,那么可以将这多个操作视为一个事务.
事务具有以下几个特性:
1.原子性,事务不可再被拆分.
2.一致性,事务提交或撤销后数据应该保持一致性.
3.独立性,并发事务直接互不干扰.
4.永久性,事务提交或者撤销后数据状态应为永久性.
事务控制可以在:
1.数据库层面
2.JDBC层面
3.应用程序层面(分布式事务)
而在JDBC层面,一个事务的多个操作必须使用同一个Connection.(可以使用 ThreadLocal --是一个本地线程共享对象 , 在本地线程中可以通过ThreadLocal进行某一共享数 据的分享 ,而不同线程中,通过ThreadLocal操作的是病态对象)
开启事务(设置Connection不要自动提交):
conn.setAutoCommit(false);
提交事务:
conn.commit();
回滚事务(撤销事务):
conn.rollback();
try {
conn = Jdbc.getConn();
conn.setAutoCommit(false); // 不要自动提交啊!:从现在开始,对数据库的一切更改是临时的!
// 操作1:修改转出方余额的SQL
String sql1 = "update cardInfo set balance=balance-? where cardId=?";
stmt = conn.prepareStatement(sql1);
stmt.setDouble(1, amount);
stmt.setString(2, a);
stmt.executeUpdate();
// 操作2:修改转入方余额的SQL
String sql2 = "update cardInfo set balance=balance+? where cardId=?";
stmt = conn.prepareStatement(sql2);
stmt.setDouble(1, amount);
stmt.setString(2, b);
stmt.executeUpdate();
conn.commit(); // 可以提交啦!:从临时状态变更为永久状态,数据更改正式生效!
System.out.println("转账执行完成!");
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback(); // 撤销刚才所做的一切更改!:还原刚才所有的更改!
System.out.println("操作1或操作2出现异常,撤销一切更改!");
} catch (SQLException e1) {
e1.printStackTrace();
}
}