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

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

分别是BDB,InnoDB。

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

下面是源码:

import java.sql.*;

public class TestCommit{
    public static void main(String args[]){
    Connection conn=null;
    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");
       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();
}catch(Exception e){
    System.out.println("操作失败!!!任务撤销!!!");
    try{
        //回滚、取消前述操作
        conn.rollback();
    }catch(Exception e1){
      e1.printStackTrace();
    }
}finally{
   try{
         if(conn!=null){
            conn.close();
         }
   }catch(Exception e1){
     e1.printStackTrace();
    }
   }
    }
}

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

下面是部分回滚:

import java.sql.*;

public class TestSavepoint{
    public static void main(String args[]){
    Connection conn=null;
    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);
       if(avg_id>100){
         conn.rollback(sp1);
       }else if(avg_id>30){
         conn.rollback(sp2);
       }
       conn.commit();
       rs=stmt.executeQuery("select * from sun");
       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();
    }catch(Exception e){
      System.out.println("Failure.rollback!!!");
   try{
       conn.rollback();
   }catch(Exception e1){
     e1.printStackTrace();
    }
    e.printStackTrace();
   }finally{
     try{
       if(conn!=null){
         conn.close();
       }
     }catch(Exception e1){
       e1.printStackTrace();
     }
   }
    }
}

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

施杨出品!!!

转载于:https://www.cnblogs.com/shiyangxt/archive/2008/08/16/1269065.html

Java事务处理类(源码)相关推荐

  1. Java String类源码阅读笔记

    文章目录 一.前置 二.String类源码解析 1.String类继承关系 2.成员变量 3.构造方法 4.长度/判空 5.取字符 6.比较 7.包含 8.hashCode 9.查询索引 10.获取子 ...

  2. java int类源码,一起学JDK源码 -- Integer类

    Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integer类中还提供了很多处理int类型的方法,接下来就让我们一起看看吧. 基础知识: 1. ...

  3. java工具类源码阅读,java学习日记第二天(实用的工具类和源码解析一Arrays)

    本帖最后由 三木猿 于 2020-9-18 11:17 编辑 每日名言 学者须先立志.今日所以悠悠者,只是把学问不曾做一件事看,遇事则且胡乱恁地打过了,此只是志不立. --朱熹 工作中经常会用到一些工 ...

  4. Java Thread类源码详解

    概述 Java所有多线程的实现,均通过封装Thread类实现,所以深入Thread类,对深入理解java多线程很有必要 构造函数: Thread的构造函数,采用缺省的方式实现: //传入Runnabl ...

  5. Java String类源码解析

    String直接继承Object 含有一个char[] value,还有一个int hash默认值为0 new String()的构造产生的是一个值为""的字符数组 String( ...

  6. Java Optional类源码解析和用法

    个人网站:http://xiaocaoshare.com/ 要求:jdk1.8以上 Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get( ...

  7. Java LinkedHashMap类源码解析

    摘要: LinkedHashMap继承了HashMap,他在HashMap的基础上增加了一个双向链表的结构,链表默认维持key插入的顺序,重复的key值插入不会改变顺序,适用于使用者需要返回一个顺序相 ...

  8. java.lang 源码剖析_java.lang.Void类源码解析

    在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code ...

  9. java的数组与Arrays类源码详解

    java的数组与Arrays类源码详解 java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 类的 ...

  10. java的String类源码详解

    java的String类源码详解 类的定义 public final class Stringimplements java.io.Serializable, Comparable<String ...

最新文章

  1. Java(CallableStatement)调用Oracle存储过程返回结果集(ResultSet)
  2. 安卓能帮你检查密码泄露了!还有Messages定时发送等多项功能优化
  3. Python语言学习 (七)1.1
  4. 3.5 Facade(外观)
  5. Django讲课笔记09:使用QuerySet新增和更新数据
  6. CCS中的cmd命令文件
  7. java 注解开发 解耦_Java提升七:注解
  8. org.apache.hadoop.hbase.TableNotDisabledException 解决方法
  9. PMP第六节:项目进度管理
  10. 磊科linux无线网卡驱动安装步骤,磊科nw360无线网卡安装教程(附磊科nw360驱动下载)...
  11. 2023年前实现大型工业企业5G应用渗透率超35%!模组企业如何保驾护航?
  12. 大数据的核心架构层是哪些?
  13. [4G5G专题-91]:流程 - 4G LTE 终端移动性管理总体概述
  14. (一)WaveDrom 数字时序图渲染引擎
  15. 简单理解云桌面的模板,桌面池和虚拟机的概念
  16. 函数式编程与Lambda表达式
  17. 安全防御之入侵检测篇
  18. java clob http传送_JAVA CLOB作为参数传给ORACLE后台
  19. Oracle 正则表达式以及常用正则函数
  20. 【gdgzezoi】Problem C: The Winds of Winter

热门文章

  1. LeetCode Clone Graph(搜索问题)
  2. luoguP2657 [SCOI2009]windy数
  3. scikit-learn 多分类混淆矩阵
  4. C#编译器选项(目标平台)
  5. STL 中priority_queue小结
  6. 基于网络音频的Android播放程序简单示例
  7. [转] 大连理工大学部分有效FTP列表1.0
  8. 未来智能社会的一砖一瓦都需要今天我们一点点的探索发现!
  9. c语言怎么写到单片机里,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  10. KVM半虚拟化驱动--virtio概述和基本原理(四)