大家好,我是被白菜拱的猪。
1.前言
有时候在具体的场景中,我们会出现这种情况,就是几个sql语句要么一起执行要么一起不执行。就拿银行汇款为例,我要向另一个人汇款五万块,首先用一个sql语句实现将我的钱的减五万,然后在用一个sql语句将另一个人的账户余额加五万元,假如两个不是一起实行的,或者说其中的一条语句出错,就假如第二个出错了,那我的钱少了五万,他的不变。假如这样的话,老猪我辛辛苦苦赚了五万块,就这么不翼而飞,这银行还能开的下去。这显然是不允许出现这种情况的。那么为了让sql语句能够实现要么都实行要么都不实行。我们引出来了批量与事务这两个概念。
2.批量(Batch)
批量批量顾名思义就是一批一批的,中国汉字博大精深。他先东西放进一个容器里面,然后一起执行。
批量(batch)很简单也很容易理解,我们只需掌握两个方法
(1)addBatch()将sql语句一起放入容器里面先存起来
(2)executeBatch() 执行容器里面的sql语句
我们前面说了,执行sql语句的对象是statement,所以这两个方法也是由statement的对象来执行。
这里只是部分代码,实现类对JDBC的封装,详细的见上一篇文章。
public void batch(ArrayList<String> sqls) {
try {
connect();
for (String sql : sqls) {
stmt.addBatch(sql);
}
//批量执行
stmt.executeBatch();
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
3.事务(Transaction)
事务与批量的区别
//批量和事务的区别
/*
* 批量:先不执行sql语句,将sql语句装入一个批次,然后同时执行,
* 在执行前如果发生了错误,则装入批次的sql语句根本没有执行。
* 事务:每个sql语句都按照原来的方式正常执行,当遇到错误的时候,
* 数据库执行回滚,将刚才已经执行的sql语句,逆向执行,恢复到事务开始之前。
* 事务的开始:conn.setAutoCommit(false);
* 事务的结果:conn.commit();
* 事务的回滚:conn.rollback();
* */
因为事务默认都自动执行的,默认为True,所以我们要将其改为false。
事务是一种逻辑上的同步,它有起点和终点。
起点就是将设置事务的提交方式为手动,也就是 设置自动提交(false)
终点为 commit()提交,中间出现了问题就回滚
回滚:
就比如很多人过独木桥,已经有很多人过去了,sql语句已经执行很多了,这时候正在过桥的一个人出现了问题掉下去了,这时候回滚就是,之前已经过去的人也要拉回到起点。
出现异常就回滚,所以达到了要么都过去要么都不过去。
//事务 == transaction
//事务是一种逻辑上的同步,有起点和终点
public void transaction(ArrayList<String> sqls) {
try {
connect();
//设置自动提交(否):事务的起点
conn.setAutoCommit(false);
for (String sql : sqls) {
stmt.executeUpdate(sql);
}
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
} finally {
try {
//提交:事务的终点
conn.commit();
} catch (Exception e) {
e.printStackTrace();
}
close();
}
}