事务及其事务优化总结

事务:

  事务是由一组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);
        }
    }
    
}
原文地址:https://www.cnblogs.com/yikuan-919/p/9520017.html