
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
7.4 JDBC高级应用——事务处理
事务处理由若干个步骤组成,所有步骤必须同时操作成功或者失败。当所有的步骤都操作成功时,事务就算操作成功了;而当其中某一个步骤操作失败时,则该步骤之前的操作就必须撤销。例如,在一个银行交易系统中,假如一个数据库表用来存放客户的存款金额,另一个数据库表用来存放客户的交易历史。客户进行交易操作的过程,就是一个典型的事务。当客户取钱时,一方面要改变客户的存款金额,另一方面要增加客户的交易历史记录,要么都成功,要么都失败,不能改变了客户的存款金额,却没有任何交易记录。
7.4.1 事务处理概述
事务的特性包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabilily)。
● 原子性:表示事务是否完全完成,若因为任何原因导致其中的一个步骤操作失败,则所有步骤都操作失败,前面已经完成的步骤也必须回滚,系统将返回到事务开始前的状态。
● 一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
● 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务是不可见的。
● 持久性:表示对数据的操作应该是持久性。
7.4.2 如何应用事务处理
要进行事务处理,就离不开事务的设定、开始事务、执行SQL、提交事务及事务失败后的回滚。下面是一个典型的应用事务处理将数据新增到数据库的过程;
public void insert() throws Exception{ //取得连接 Class.forName("org.postgresql.Driver"); String url ="JDBC:postgresql://localhost/ testDb " String user="postgres"; String password=" postgres "; Connection conn= DriverManager.getConnection(url,user,password); try { //开始进行事务处理 conn.setAutoCommit(false); Statement stmt = con.createStatement(); String sql = "insert into user (username, password) values('" + username + "', '" + password + "')"; //执行新增语句 int counts = stmt.executeUpdate(sql); if (counts != 0) { infoOut.put("msg", "新增成功"); } else { infoOut.put("msg", "新增失败"); } //事务提交 con.commit(); } catch (SQLException e) { e.printStackTrace(); } catch(Exception e){ //事务回滚 con.rollback(); e.printStackTrace(); } finally { //关闭连接 con.close(); } }