事务---要么全做,要么一个都不做。
原子性
(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)。
隔离性
(isolcation):一个事务处理对另一个事务处理没有影响。
持续性(durability):事务处理的效果能够被永久保存下来 。
1.打开事务
connection.setAutoCommit(false);
2.提交事务
connection.commit();
3.回滚事务
connection.rollback();
本来打算模拟一个将一个账户的钱转到另一个账户中,但是转账的过程中出现了问题。
不知道为什么在oracle一直不成功,后来用mysql实现了。
之前的数据库
public static void test() throws SQLException {
Connection con = null;
ResultSet rs = null;
Statement st = null;
try {
con = JdbcUtil.getConnection();
con.setAutoCommit(false);
st = con.createStatement();
String sql = "update person set money=money-100 where id=2";
st.executeUpdate(sql);
sql = "select money from person where id=3";
rs = st.executeQuery(sql);
int money = 0;
if (rs.next()) {
money = rs.getInt("money");
}
if (money > 300) {
throw new RuntimeException("已经超过最大值");
}
sql = "update person set money=money+100 where id=2";
st.executeUpdate(sql);
con.commit();
} catch (SQLException e) {
con.rollback();
throw e;
} finally {
JdbcUtil.free(rs, st, con);
}
}
结果:
Exception in thread "main" java.lang.RuntimeException: 已经超过最大值
at cn.lib.jdbc.TxTest.test(TxTest.java:61)
at cn.lib.jdbc.TxTest.main(TxTest.java:17)
但是数据库中的值没有发生变化。