事务:
事务是由一组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); } } }