Java事务处理类(源码)

今天晚上写了一个Java关于Mysql数据库的事物处理类,实现回滚&&部分回滚功能。

 

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

 

分别是BDB,InnoDB。

 

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

 

下面是源码:

 

import  java.sql. * ;

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

ExpandedSubBlockStart.gifContractedSubBlock.gif}
finally{
ExpandedSubBlockStart.gifContractedSubBlock.gif   
try{
ExpandedSubBlockStart.gifContractedSubBlock.gif         
if(conn!=null){
            conn.close();
         }

ExpandedSubBlockStart.gifContractedSubBlock.gif   }
catch(Exception e1){
     e1.printStackTrace();
    }

   }

    }

}

 

 

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

 

下面是部分回滚:

 

 

 

import  java.sql. * ;

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

       conn.commit();
       rs
=stmt.executeQuery("select * from sun");
ExpandedSubBlockStart.gifContractedSubBlock.gif       
while(rs.next()){
            System.out.print(rs.getInt(
1));
            System.out.print(
"\t"+rs.getString(2).trim());
            System.out.println(
"\t"+rs.getString(3));
}
   
rs.close();
stmt.close();
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
catch(Exception e){
      System.out.println(
"Failure.rollback!!!");
ExpandedSubBlockStart.gifContractedSubBlock.gif   
try{
       conn.rollback();
ExpandedSubBlockStart.gifContractedSubBlock.gif   }
catch(Exception e1){
     e1.printStackTrace();
    }

    e.printStackTrace();
ExpandedSubBlockStart.gifContractedSubBlock.gif   }
finally{
ExpandedSubBlockStart.gifContractedSubBlock.gif     
try{
ExpandedSubBlockStart.gifContractedSubBlock.gif       
if(conn!=null){
         conn.close();
       }

ExpandedSubBlockStart.gifContractedSubBlock.gif     }
catch(Exception e1){
       e1.printStackTrace();
     }

   }

    }

}

 

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

 

施杨出品!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值