20-JDBC-批量与事务

本文深入探讨了在银行汇款等场景下,为确保数据一致性,如何利用SQL的批量执行与事务处理机制。批量执行将多个SQL语句打包一次性执行,而事务则确保操作要么全部完成要么完全不发生,通过回滚机制保障数据完整。

大家好,我是被白菜拱的猪。

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();
		}
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值