事务概念

对多个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();
                }
            }
            
        }
    }
}
View Code

相关文章: