Dbutils 事务处理
@Test
public void testSaveMoney(){
Connection conn =null;
PreparedStatement pstmt = null;
String accountId="123456789";
double money =100;
ResultSet rs = null;
String sql = "Insert into inaccount (accountid,inbalance) values(?,?)";
try {
conn = DBUtil.getCon();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, accountId);
pstmt.setDouble(2, money);
pstmt.executeUpdate();
sql = "update account set balance=balance+? where accountid=?";
pstmt = conn.prepareStatement(sql);
pstmt.setDouble(1, money);
pstmt.setString(2, accountId);
boolean flag = true;
if(flag){
throw new SQLException("因网络或不明原因出异常!");
}
pstmt.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(conn, pstmt, rs);
}
}
如果不使用事务操作,对于一个银行业务来说是致命的,上面的这个示例,造成的结果就是一个inaccount表中会插入一条数据,而account表中没有任何改变。
事务的类型:
自动提交:执行update马上保存数据
手动提交:执行update不保存数据,先放入缓存,只有执行Commit,才保存
设置事务:
@Test
public void testSaveMoney(){
Connection conn =null;
PreparedStatement pstmt = null;
String accountId="123456789";
double money =100;
ResultSet rs = null;
String sql = "Insert into inaccount (accountid,inbalance) values(?,?)";
try {
conn = DBUtil.getCon();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, accountId);
pstmt.setDouble(2, money);
pstmt.executeUpdate();
sql = "update account set balance=balance+? where accountid=?";
pstmt = conn.prepareStatement(sql);
pstmt.setDouble(1, money);
pstmt.setString(2, accountId);
boolean flag = true;
if(flag){
throw new SQLException("因网络或不明原因出异常!");
}
pstmt.executeUpdate();
//提交事务
} catch (Exception e) {
// TODO Auto-generated catch block
//回滚事务,回滚到conn.setAutoCommit(false);
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
DBUtil.close(conn, pstmt, rs);
}
}
在事务没有提交之前,数据时先放到缓存中的,但是事务提交时会将数据保存到表中并清空缓存,rollback的原理也是清空缓存这样就不会出现上面的问题
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。