jdbc实现简单的事务

1、创建账户account数据表
 create table account(
 	id int primary key auto_increment,
 	name varchar(100),
 	money int
 );
 insert into account (name,money) values('aaa',1000);
 insert into account (name,money) values('bbb',1000);

2、账户aaa给账户bbb转账,模拟出现错误,交易失败的情况。
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
	conn = JdbcUtils.getConnection();//此链接,默认事务是自动提交的。即一条sql语句就是一个事务。
	String sql = "update account set money=money-100 where name='aaa'";
	stmt = conn.prepareStatement(sql);
	stmt.executeUpdate(sql);
	
	int i = 1/0;//转账过程出现异常,程序终止运行。aaa付钱,然而bbb并没有收到钱。
	
	sql = "update account set money=money+100 where name='bbb'";
	conn.prepareStatement(sql);
	stmt.executeUpdate(sql);		
} catch (Exception e) {	
	e.printStackTrace();	
}finally{		
	JdbcUtils.release(rs, stmt, conn);
}

结果:aaa账户money=900,而bbb账户还是1000。出现错误!!!

3、开启事务
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
	conn = JdbcUtils.getConnection();
	
	conn.setAutoCommit(false);// start transaction 开启事务
	
	String sql = "update account set money=money-100 where name='aaa'";
	stmt = conn.prepareStatement(sql);
	stmt.executeUpdate(sql);

	int i = 1 / 0;// 异常

	sql = "update account set money=money+100 where name='bbb'";
	conn.prepareStatement(sql);
	stmt.executeUpdate(sql);
} catch (Exception e) {
	try {
		conn.rollback();
	} catch (Exception e1) {
		e1.printStackTrace();
	}
	e.printStackTrace();
} finally {
	try {
		conn.commit();
	} catch (SQLException e2) {
		e2.printStackTrace();
	}
	JdbcUtils.release(rs, stmt, conn);
}

结果:因为出现错误,所以自动回滚到 start transaction处。aaa和bbb账户都为1000。结果合理。

4、自己设定回滚点。
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Savepoint sp = null;//回滚点
try {
	conn = JdbcUtils.getConnection();
	conn.setAutoCommit(false);// start transaction 开启事务
	String sql = "update account set money=money-100 where name='aaa'";
	stmt = conn.prepareStatement(sql);
	stmt.executeUpdate(sql);
	
	sp = conn.setSavepoint();//设置回滚点
	int i = 1 / 0;// 异常

	sql = "update account set money=money+100 where name='bbb'";
	conn.prepareStatement(sql);
	stmt.executeUpdate(sql);
} catch (Exception e) {
	try {
		conn.rollback(sp);
	} catch (Exception e1) {
		e1.printStackTrace();
	}
	e.printStackTrace();
} finally {
	try {
		conn.commit();
	} catch (SQLException e2) {
		e2.printStackTrace();
	}
	JdbcUtils.release(rs, stmt, conn);
}

结果:出现了异常,因为设置了回滚点,所以回滚到sp = conn.setSavepoint();处。而没有回滚到开启事务conn.setAutoCommit(false);处。
    所以结果是:aaa为900,bbb为1000。

5、其他详细,请参考mysql中文API。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值