JDBC学习之路(六)事务的概念和处理

18 篇文章 0 订阅

数据库的操作对事务这一概念非常重要,事务的概念是一个不可分割的整体,具有原子性。比如银行转账,当从一方扣钱完毕出现异常,结果接收方没有收到钱,这样是绝对不行的,所以需要回滚,这就是事务。

下面呈上例子代码,这里模仿从一个人的钱里面扣钱,但是回滚到指定的地方,其实首先需要指定自动提交为false,然后一直等到所有事务处理完毕才能提交,然后可以设置保存点,然后回滚的时候回滚到指定的位置。

package com.bird.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;

import com.bird.jdbc.dao.DaoException;

public class TxTest {

	/**
	 * @param args
	 * @throws SQLException 
	 */
	public static void main(String[] args) throws SQLException {
		test();
	}
	
	
	public static void test() throws SQLException{
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Savepoint sp = null;
		
		try {
			con = Temple.getConnection();
			
			con.setAutoCommit(false);//设置自动提交为false,禁止自动提交
			
			String sql = "update user set money=money-10 where id=1";
			ps = con.prepareStatement(sql);
			ps.executeUpdate();
			
			sp = con.setSavepoint();
			
			sql = "update user set money=money-10 where id=3";
			ps=con.prepareStatement(sql);
			ps.executeUpdate();
			
			sql = "select money from user where id=2";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			float money = 0.0f;
			if(rs.next()){
				money = rs.getFloat("money");
			}
			if(money > 200)
				throw new RuntimeException("钱够多了,超过最大值");
			
			sql = "update user set money=money+10 where id=2";
			ps=con.prepareStatement(sql);
			ps.executeUpdate();
			
			con.commit();//一并提交,放到一个事件中去
			
		} catch (RuntimeException e) {
			if(con != null && sp != null)
				con.rollback(sp);
				con.commit();
			throw new DaoException(e);
		} catch (SQLException e) {
			if(con != null)
				con.rollback();
			throw new DaoException(e);
		} finally{
			Temple.free(con, ps, rs);
		}
	}
}
虽然代码很短,而且关于事务的代码其实是很少的,所以好好记住

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值