zoukankan      html  css  js  c++  java
  • oracle事务处理及实例演示jdbc操作批量删除

    事务

            

           作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成。当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个非常好的应用。

    对于事务的基本性质在还有一篇中有所叙述:SQL 事务及实例演示


     

    oraclesql server在事务上差别


     

    sql server中的事务一般分为隐式事务、显式事务、自己主动提交事务。


    自己主动事务:对于sql server来说,当client提交一条sql语句时,这时候sql server都会自己主动启动一个事务;对于这种事务,在运行完sql语句后会自己主动提交。


    显示事务:这也是比較常见的使用的事务;事实上实质上也就是在自己主动事务上,添加一个Begintranconn.commit,end tran.


    隐式事务:相比显示事务须要开启connection,隐式事务是默认开启事务的Begin和数据库连接的。当然后面还是要进行commitrollback操作的。


           而oracle的事务就没有这么如此丰富了,和sql server的隐式事务类似;无需开启connBegin,仅仅要在兴许操作进行commitrollback操作。


     

    事务提交的机制


     

          先了解一些基础的概念,data buffer cache:相当于一块连接硬盘文件和oracle数据操作的快速仅仅读缓存。

    SGA:在启动oracle实例后,在内存中开辟的一块内存空间,用于存放server的控制信息以及数据。

    数据块:数据存储的基本单位。

    当连接到数据库后,oracle为连接的用户创建独立的进程-影子进程,这个进程伴随用户的整个操作;


    1.检查数据块

    2.构造undo数据块

    以此来回滚数据

    3.生成redo日志

    用于又一次操作的日志存放在log buffer cache中。

    4.lgwr进程启动,提交事务并书写全部日志文件


     

    java事务处理


     

    TestDemo:结合位于java.sql以下的接口 PreparedStatement和oracle事务实现批量删除


    经常用法:

    int[]executeBatch()

    将一批命令提交给数据库来运行,假设所有命令运行成功,则返回更新计数组成的数组。

    voidsetString(int parameterIndex,
                   String x)

    将指定參数设置为给定Java String 值。在将此值发送给数据库时,驱动程序将它转换成一个 SQL VARCHAR 或 LONGVARCHAR 值。

     

    Demo

     

    /**删除用户-2014年8月11日18:19:04
     * @userId 用户id数组
     */
    publicBoolean DeleteUser(String[] userId){
    //一个线程安全的可变字符串
    StringBuffersb=new StringBuffer();
    sb.append("deletefrom t_user where user_id =?");
    Connectionconn=null;
    PreparedStatementpsmt = null; 
    Booleanflag=false;
     
    conn=DButil.getConnection();
    try {
    //关闭自己主动提交事务
    conn.setAutoCommit(false);
    //创建一个 PreparedStatement 对象来将參数化的 SQL语句发送到数据库。
    psmt= conn.prepareStatement(sb.toString());
    //将一组參数加入到此 PreparedStatement 对象的批处理命令中。
    for(inti =0 ;i<userId.length;i++){
    psmt.setString(1,userId[i].trim());
    psmt.addBatch();                                
    }
     
      
       // 运行批量更新
       psmt.executeBatch();
       // 语句运行完成,提交本事务
       conn.commit();
      
       flag=true;
    }catch (SQLException e) {
    //TODO Auto-generated catch block
    e.printStackTrace();
    try{
    conn.rollback();
    }catch (SQLException e1) {
    //TODO Auto-generated catch block
    e1.printStackTrace();
    }
    }
     
    returnflag;
    }
     


    总结


         总的来说,感觉还是对oracle非常多内部的机制了解的有限。前几天的设计模式讲课,也让想到这里的一些东西才有了这篇博客。仅仅能说是非常浅显的认知,oracle在事务这里的处理相比在事务的处理上本质还是一致的。 跨网络或进程间的数据通信,应该是粗粒度,而不是细粒度的。也就是说:client与数据库之间不应该频繁的交互,浪费资源; 或者进程间也是相同的道理.而数据库之间的事务处理也是这样一个思维的体现。

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4037648.html
Copyright © 2011-2022 走看看