事务学习--转账例子

package cn.taylor.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;

/*
 * 学习事务最简单的例子就是转账,假如张三给李四转100块钱,其实用两句sql语句就可以实现,
 * 第一句是给张三账户减去100;第二句是给李四账户加上100
 * 但是如果在第一句sql语句执行之后出现错误,导致第二句没有执行,就会出现张三的钱少了,
 * 而李四的钱没加,为了避免这种情况,我们学习事务。
 * 一旦拥有了事务的原子性,事务中的操作要么全部执行,要么全部执行失败。
 */
/*
 * jdbc中的事务的代码格式
 * try{
 * 	con.setAutoCommit(false);	//开启事务
 * 	...
 *  ....
 *  con.commit();	//try的最后提交事务
 * }
 * catch(){
 * con.rollback();	//回滚事务,表示结束
 * }
 */
public class AccountDao {
	/*
	 * 修改时指定用户的余额
	 */
	public void updateBalance(Connection con,String name,double balance){
		try{
		//在jdbc中处理事务,都是通过Connection对象完成的。
			
		/*
		 * 在同一事务中所有的操作,都在使用同一个Connection对象,为了保证这一点 ,
		 * 所以要将下面代码修改。
		 * 改成是在方法的参数中提供Connection对象
		 */
			//Connection con =JdbcUtils.getConnection();
			String sql="update balance set balance=balance+? where name=?";
			PreparedStatement pstmt=con.prepareStatement(sql);
			
			pstmt.setDouble(1, balance);
			pstmt.setString(2, name);
			
			pstmt.executeUpdate();
			
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	
		
	}

}

package cn.taylor.dao;

import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;
/*
 * 所有对Connection的操作都在Service层进行的处理
 * 之后我们要改进这个问题,我们要把所有对Connection的操作隐藏起来,这需要使用
 * 自定义的小工具。
 */
public class Demo1 {
	public void zhuanzhang(String from,String to,double money) throws Exception{
		//对事物的操作必须使用Connection对象
		Connection con=null;
		try{
			con=JdbcUtils.getConnection();
			con.setAutoCommit(false);	//设置不要自动提交
			AccountDao dao=new AccountDao();
			
			dao.updateBalance(con, from, -money);
			dao.updateBalance(con, to, money);
			
			con.commit();
			con.close();
		}catch(Exception e){
			try{
				con.rollback();
				con.close();
			}catch(SQLException e1){}
			throw new RuntimeException(e);
			}
		}
	
	@Test
	public void fun1() throws Exception{
		zhuanzhang("zhangsan","lisi",100);
	}
	}
	


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值