zoukankan      html  css  js  c++  java
  • 事务及其事务优化总结

    事务:

      事务是由一组SQL语句组成的;

      事务的SQL语句要么整体成功,要么整体失败;

      数据操作的最小单元是事务,而不是sql语句;

    启动事务:

      begin

      start transaction

      事务启动后,执行的数据增删改操作,会暂时记录在一个日志文件中;

    提交事务:

      commit

      事务日志中记录的数据操作,在数据表中生效;

      清空日志文件;

    回滚事务:

      rollback

      清空日志;

    事务的特性:

      A----Atomic

        原子性,数据操作的最小单元是事务,而不是sql语句

      C----Consistency

        一致性,事务完成前后,数据要保持逻辑的一致性  

      I----Isolation

        隔离性,一个事务操作数据时,其他事务要等待

      D----Durancy

        持久性,事务成功,数据被永久的保存;

    JDBC默认是做了事务管理的,并且默认是开启的模式。每次SQL执行之前都会开启一次事务,每次SQL执行之后提交事务;

    优化:

      关闭JDBC事务管理  +  手动提交事务!!!

    代码:

    package cn.yikuan.batch;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.junit.Test;
    
    import cn.tedu.util.JDBCUtils;
    
    /**
     * 这个类用来测试jdbc的批处理
     * @author Administrator
     *
     */
    public class BatchTest {
        //实现方式一:利用statement对象完成
        @Test
        public void StatementBatch(){
            Connection conn = null;
            Statement st = null;
            
            try {
                //1.注册驱动
                //2.获取数据库连接
                conn = JDBCUtils.getConnection();
                long t = System.currentTimeMillis();
                //)))1.关闭jdbc的事务管理,
                conn.setAutoCommit(false);
                //3.获取传输器
                st = conn.createStatement();
                //4.执行sql
                for(int i=0;i<1000000;i++){
                    String sql = "insert into dept values(null,'"+i+"')";
                    
                    //把sql打包成批次
                    st.addBatch(sql);
                }
                //统一发送给服务器执行批
                int[] rows = st.executeBatch();
                //)))2.手动提交事务
                conn.commit();
                //5.遍结果集
                System.out.println(rows.length);
                t = System.currentTimeMillis()-t;
                System.out.println(t);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //6.释放资源
                JDBCUtils.close(null,st, conn);
            }
        }
        
        @Test
        public void psBatch(){
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                //1.注册驱动
                //2.获取数据库连接
                conn = JDBCUtils.getConnection();
                long t = System.currentTimeMillis();
                //)))1.关闭jdbc的事务管理,
                conn.setAutoCommit(false);
                //3.获取传输器;4.执行sql
                String sql = "insert into dept values(null,?)";
                ps = conn.prepareStatement(sql);
                for (int j = 0; j < 1000000; j++) {
                    ps.setString(1,"ps"+j);
                    //把sql打成批次
                    ps.addBatch();
                }
                //统一发送给数据库服务器
                int[] rows = ps.executeBatch();
                //)))2.手动提交事务
                conn.commit();
                //5.遍历结果集
                System.out.println(rows.length);
                t = System.currentTimeMillis()-t;
                System.out.println(t);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.close(null, ps, conn);
            }
        }
        
    }
  • 相关阅读:
    批处理、WMI、wmic、守护进程
    链接
    给自己一个提醒——读了这篇文章感觉目前就略有体会,但是它又是一个长期的过程。
    如何设置一个日期型的TextView
    广播机制与短信拦截器
    开篇来个记录随笔 ,再感谢一下园子的管理们
    J2EE (四) Servlet 模板方法模式
    J2EE (五) SQL+PageClass实现真分页
    JMeter设置HTML报告中开始以及结束时间精确到秒
    Tomcat部署应用启动报错java.lang.ClassCastException: [XXX].filter.CharacterEncoding cannot be cast to jakarta.servlet.Filter
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9520017.html
Copyright © 2011-2022 走看看