批处理
@Test
public void test() {
connection = JDBCUtils.getConnection();
try {
// ps = connection.prepareStatement("insert into user (name,password,loves,email,img) values (?,?,?,?,?)");
ps = connection.prepareStatement("delete from user where name=?");
for (int i = 10; i < 1000; i++) {
ps.setString(1,i+"");
ps.addBatch();
}
ps.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCClose.JDBCClose(connection,ps,resultSet);
}
}
写进内存:ps.addBatch();
执行批处理:ps.executeBatch();
当sql语句太多时可以在循环中添加一个条件,每1000条执行一次,这就叫分批处理
例如这样:
if(i%1000==0){
ps.executeBatch();
//清空缓存
ps.clearBatch();
}
事务
开启事务:
start transaction
提交事务:
commit
回滚事务;
rollback
在JDBC中这样用:
//开启事务
connection.setAutoCommit(false);
//事务回滚
connection.rollback();
//事务提交
connection.commit();
事务回滚一般放在catch中,当出现异常时回滚操作
事务的特点
ACID
一致性
原子性
隔离性
持久性
脏读:
一个线程中的事务读取到了另一个线程中未提交的update数据
例子:
事务一:张三给李四转账100元
事务二:李四查账
事务一开始事务,但是没有提交事务
这时候事务二开始事务
李四查账可以看到多出来的100元
这是不对的
这就是脏读
避免脏读
read committed
不可重复读:
一个线程中的事务读取到了另一个线程的事务中已提交的update的数据
例子
张三买书,第一次查询时书的库存还有一本,可以购买,这时就准备下单了,就在这时,
另一个李四把书买走了,(update操作),当系统再去查看书的数量时,发现书的库存为0,就不能下单了,
这就是不可重复读.
避免不可重复读
repeatable able
幻读:
一个线程的事务中读取到了另一个线程的事务中已提交的insert数据
张三打印自己的银行卡余额有200,打印的前一刻,张三妻子往里面转了100块钱(insert操作),所以打印出来了300块,这就是幻读
事务隔离级别:
read uncommitted
脏读,不可重复读,幻读有可能发生
read committed
避免脏读(不可重复读和幻读可能发生)
repeatable read
避免脏读,不可重复读(幻读可能发生)
serializable
避免脏读,不可重复读,幻读