事务概念
对多个SQL指令进行操作,只有这些指令都成功时,才能认为整个操作是完成的,这样的操作称为”事务操作“。如果一个SQL指令操作失败,之前的各个操作都要取消,这种取消动作称为”回滚 (rollback)“。
JDBC中的事务操作是基于同一个数据连接的,各个连接之间相互独立。当数据连接断开后,一个事务就结束了。事务操作的方法都位于java.sql.Connection接口中。
JDBC事务操作默认是自动提交的,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统会自动调用commit()来提交,否则会调用rollback()来回滚。如果想取消自动提交可以调用setAutoCommit(false),回复自动提交则可以设置其实参为true。取消自动提交可以灵活地将多个表达式作为一个事务,然后使用commit()来提交,如果出现异常可以使用rollback()来回滚。
实例
import java.sql.*; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Connection con = null; Statement smt; try{ Class.forName("com.mysql.jdbc.Driver");//加载JDBC MYSQL驱动 con=DriverManager.getConnection("jdbc:mysql://localhost:3306/javatemp","root","root"); //建立数据库连接 con.setAutoCommit(false);//取消事务的自动提交 //System.out.println(con.getTransactionIsolation()); //获取事务默认加锁方式 //con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);//设置事务加锁方式 //System.out.println(con.getTransactionIsolation());//获取事务当前加锁方式 smt=con.createStatement();//创建Statement对象 smt.executeUpdate("insert into users(username) values('beston5')");//执行SQL命令 con.rollback();//回滚 smt.executeUpdate("insert into users(username) values('beston6')"); con.commit();//提交 con.setAutoCommit(true);//恢复事务的自动提交 PreparedStatement ps=con.prepareStatement("insert into users(username) values(?)");//使用prepareStatement对象操作数据指令 ps.setString(1,"oseye6");//设置占位符值 ps.executeUpdate(); //执行SQL命令 ResultSet res=smt.executeQuery("select * from users");//执行SQL命令并获得结果集 while(res.next()){//处理结果集 System.out.println("userid:"+res.getInt("userid")+"\t"+"username:"+res.getString("username")); } res.close();//关闭结果集连接的数据并释放JDBC资源 }catch(Exception ex){ ex.printStackTrace();//打印异常信息 }finally{ if(con!=null){ try{ con.close();//关闭数据库连接 }catch(Exception ex){ ex.printStackTrace(); } } } } }