在数据库操作中,一项事务是指由一条或多条对数据库更新的 sql 语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了,整个事务才能被提交到数据库,如果有一项操作没有完成,就必须撤消整个事务。 例如在银行的转帐事务中,假定张三从自己的帐号上把 1000 元转到李四的帐号上,相关的 sql 语句如下: update account set monery=monery-1000 where name=’zhangsan’ update account set monery=monery+1000 where name=’lisi’ 这个两条语句必须作为一个完成的事务来处理。只有当两条都成功执行了,才能提交这个事务。如果有一句失败,整个事务必须撤消。 在 connection 类中提供了 3 个控制事务的方法: (1) setAutoCommit(Boolean autoCommit): 设置是否自动提交事务; (2) commit(); 提交事务; (3) rollback(); 撤消事务; 在 jdbc api 中,默认的情况为自动提交事务,也就是说,每一条对数据库的更新的 sql 语句代表一项事务,操作成功后,系统自动调用 commit ()来提交,否则将调用 rollback ()来撤消事务。 在 jdbc api 中,可以通过调用 setAutoCommit(false) 来禁止自动提交事务。然后就可以把多条更新数据库的 sql 语句做为一个事务,在所有操作完成之后,调用 commit ()来进行整体提交。倘若其中一项 sql 操作失败,就不会执行 commit ()方法,而是产生相应的 sqlexception ,此时就可以捕获异常代码块中调用 rollback ()方法撤消事务。 Try{ Con = java.sql.DriverManager.getConnection(dburl , dbUser , dbPass); Con.setAutoCommit(false); Stmt = con.createStatement(); Stmt.executeUpdate(“update account set monery=monery-1000 where name=’zhangsan’”); stmt.executeUpdate(“update account set monery=monery+1000 where name=’lisi’”); con.commit(); }catch(Exception ex){ ex.printStackTrace(); try{ con.rollback(); }catch(Exception e){ e.printStackTrace(); } }finally{ try{ stmt.close(); con.close(); }catch(Exception e){ e.printStackTrace(); } } |