使用JDBC控制事务
实际应用中有时候会遇到一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。现在我们使用JDBC来操作数据库,那么需要在JDBC中控制事务,JDBC中我们使用Connection对象来管理事务。
-
开启事务:setAutoCommit(boolean autoCommit) :传入false为手动开启事务
- 在执行sql之前开启事务
-
提交事务:commit()
- 当所有sql都执行完提交事务
-
回滚事务:rollback()
- 在catch中回滚事务
下面使用JDBC程序模拟转账的操作,中间手动制造一个异常,因为程序出现了异常,所以事务要回滚,即在catch中要进行事务的回滚操作。倘若程序没有进入到catch中,则提交事务。最后不要忘了关闭相关资源。
代码示例:
@Test
public void testTransaction() {
Connection conn = null;
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
// 获取连接Connection
try {
conn = DBUtil.getConnection();
//手动开启事务
conn.setAutoCommit(false);
String sql1 = "update t_bank set money=? where account=?;";
String sql2 = "update t_bank set money=? where account=?;";
// 得到执行sql语句的对象PreparedStatement
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//设置参数
pstmt1.setInt(1, 500);
pstmt1.setInt(2, 1001);
pstmt2.setInt(1, 2500);
pstmt2.setInt(2, 1002);
//执行sql
pstmt1.executeUpdate();
//手动制造异常
System.out.println(10 / 0);
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
//如果出现异常,则回滚事务
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
if (pstmt1 != null) {
pstmt1.close();
}
if (pstmt2 != null) {
pstmt2.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
海报
0 条评论
187
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~