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与数据库之间不应该频繁的交互,浪费资源; 或者进程间也是相同的道理.而数据库之间的事务处理也是这样一个思维的体现。

  • 相关阅读:
    Easy Code 自定义的模板
    LINUX批量修改文件名
    解决FTP登录太慢
    linux 命令
    Linux rename命令
    MySQL字段重复出现多少次
    kafka安装
    Redis 5.0简单安装
    Tomcat常用配置
    jenkins安装和简单配置
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4037648.html
Copyright © 2011-2022 走看看