且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java事务处理类(源码)

更新时间:2022-09-22 10:58:11

Mysql5很好的支持了事物处理功能。不过支持这个功能的只有两种表类型。

 

分别是BDB,InnoDB。

 

先建立一个表,名为Kiss,数据为id (int),name(varchar),pop(varchar)。

 

下面是源码:

 

Java事务处理类(源码)
Java事务处理类(源码)import java.sql.*;
Java事务处理类(源码)
Java事务处理类(源码)
public class TestCommit{
Java事务处理类(源码)    
public static void main(String args[]){
Java事务处理类(源码)    Connection conn
=null;
Java事务处理类(源码)    
try{
Java事务处理类(源码)       Class.forName(
"com.mysql.jdbc.Driver");
Java事务处理类(源码)       String url
="jdbc:mysql://localhost:3306/kiss";
Java事务处理类(源码)       conn
=DriverManager.getConnection(url,"username","password");
Java事务处理类(源码)       
boolean autoCommit=conn.getAutoCommit();
Java事务处理类(源码)       
//关闭自动提交功能
Java事务处理类(源码)
       conn.setAutoCommit(false);
Java事务处理类(源码)       Statement stmt
=conn.createStatement();
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(15,'Hello','Beijing')");
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(16,'Hi','shanghai')");
Java事务处理类(源码)       ResultSet rs
=stmt.executeQuery("select * from sun");
Java事务处理类(源码)       
while(rs.next()){
Java事务处理类(源码)            System.out.print(
"DeptNo:"+rs.getInt(1));
Java事务处理类(源码)            System.out.print(
"\tDeptName:"+rs.getString(2));
Java事务处理类(源码)            System.out.println(
"\tLOC:"+rs.getString(3));
Java事务处理类(源码)}
   
Java事务处理类(源码)
//提交事务
Java事务处理类(源码)
    conn.commit();
Java事务处理类(源码)
//恢复原来的提交模式
Java事务处理类(源码)
    conn.setAutoCommit(autoCommit);
Java事务处理类(源码)    stmt.close();
Java事务处理类(源码)}
catch(Exception e){
Java事务处理类(源码)    System.out.println(
"操作失败!!!任务撤销!!!");
Java事务处理类(源码)    
try{
Java事务处理类(源码)        
//回滚、取消前述操作
Java事务处理类(源码)
        conn.rollback();
Java事务处理类(源码)    }
catch(Exception e1){
Java事务处理类(源码)      e1.printStackTrace();
Java事务处理类(源码)    }

Java事务处理类(源码)}
finally{
Java事务处理类(源码)   
try{
Java事务处理类(源码)         
if(conn!=null){
Java事务处理类(源码)            conn.close();
Java事务处理类(源码)         }

Java事务处理类(源码)   }
catch(Exception e1){
Java事务处理类(源码)     e1.printStackTrace();
Java事务处理类(源码)    }

Java事务处理类(源码)   }

Java事务处理类(源码)    }

Java事务处理类(源码)}
Java事务处理类(源码)

 

 

执行第一次执行这个类,id如果不冲突,就可以顺利插入数据,第二次插入,id冲突,则实现回滚。

 

下面是部分回滚:

 

 

 

Java事务处理类(源码)
Java事务处理类(源码)import java.sql.*;
Java事务处理类(源码)
Java事务处理类(源码)
public class TestSavepoint{
Java事务处理类(源码)    
public static void main(String args[]){
Java事务处理类(源码)    Connection conn
=null;
Java事务处理类(源码)    
try{
Java事务处理类(源码)       Class.forName(
"com.mysql.jdbc.Driver");
Java事务处理类(源码)       String url
="jdbc:mysql://localhost:3306/kiss";
Java事务处理类(源码)       conn
=DriverManager.getConnection(url,"username","password");
Java事务处理类(源码)       
boolean autoCommit=conn.getAutoCommit();
Java事务处理类(源码)       
//关闭自动提交功能
Java事务处理类(源码)
       conn.setAutoCommit(false);
Java事务处理类(源码)       Statement stmt
=conn.createStatement();
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(21,'Hello','Beijing')");
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(22,'Hi','shanghai')");
Java事务处理类(源码)       Savepoint sp1
=conn.setSavepoint("p1");
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(25,'shiyang','xingtai')");
Java事务处理类(源码)       Savepoint sp2
=conn.setSavepoint("p2");
Java事务处理类(源码)       stmt.executeUpdate(
"insert into sun values(60,'shiyang','baoding')");
Java事务处理类(源码)       ResultSet rs
=stmt.executeQuery("select avg(id) from sun");
Java事务处理类(源码)       rs.next();
Java事务处理类(源码)       
double avg_id=rs.getDouble(1);
Java事务处理类(源码)       
if(avg_id>100){
Java事务处理类(源码)         conn.rollback(sp1);
Java事务处理类(源码)       }
else if(avg_id>30){
Java事务处理类(源码)         conn.rollback(sp2);
Java事务处理类(源码)       }

Java事务处理类(源码)       conn.commit();
Java事务处理类(源码)       rs
=stmt.executeQuery("select * from sun");
Java事务处理类(源码)       
while(rs.next()){
Java事务处理类(源码)            System.out.print(rs.getInt(
1));
Java事务处理类(源码)            System.out.print(
"\t"+rs.getString(2).trim());
Java事务处理类(源码)            System.out.println(
"\t"+rs.getString(3));
Java事务处理类(源码)}
   
Java事务处理类(源码)rs.close();
Java事务处理类(源码)stmt.close();
Java事务处理类(源码)    }
catch(Exception e){
Java事务处理类(源码)      System.out.println(
"Failure.rollback!!!");
Java事务处理类(源码)   
try{
Java事务处理类(源码)       conn.rollback();
Java事务处理类(源码)   }
catch(Exception e1){
Java事务处理类(源码)     e1.printStackTrace();
Java事务处理类(源码)    }

Java事务处理类(源码)    e.printStackTrace();
Java事务处理类(源码)   }
finally{
Java事务处理类(源码)     
try{
Java事务处理类(源码)       
if(conn!=null){
Java事务处理类(源码)         conn.close();
Java事务处理类(源码)       }

Java事务处理类(源码)     }
catch(Exception e1){
Java事务处理类(源码)       e1.printStackTrace();
Java事务处理类(源码)     }

Java事务处理类(源码)   }

Java事务处理类(源码)    }

Java事务处理类(源码)}
Java事务处理类(源码)

 

代码测试通过,完美运行。


本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/08/16/1269065.html,如需转载请自行联系原作者