zoukankan      html  css  js  c++  java
  • 事务处理-回滚(转账操作)

    JDBC事务处理-四大原则

    原子性
    一致性
    隔离性
    持久性

    第一步:实现转账操作

    假设在账户中,盖伦有余额5000元,赵信有余额2000元,

    盖伦要向赵信转账1000元。

    	public static void outMoney(Connection conn,String name,int account) throws SQLException{
    		String sql="update t_account set balance=balance-? where name=?";
    		PreparedStatement pst=conn.prepareStatement(sql);
    		pst.setInt(1, account);
    		pst.setString(2, name);
    		int result=pst.executeUpdate();
    		pst.close();
    	}
    	public static void inMoney(Connection conn,String name,int account) throws SQLException{
    		String sql="update t_account set balance=balance+? where name=?";
    		PreparedStatement pst=conn.prepareStatement(sql);
    		pst.setInt(1, account);
    		pst.setString(2, name);
    		int result=pst.executeUpdate();
    		pst.close();
    	}
    

      

    		System.out.println("盖伦正在给赵信转账1000元");
    		//转账操作
    		try {
    			outMoney(conn,"盖伦",1000);
    			inMoney(conn,"赵信",1000);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			try {
    				System.out.println("转账成功!");
    				conn.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    

      运行:

    正常转账成功。

    假设  public static void inMoney(Connection conn,String name,int account)运行时出现意外。

    人为构造意外

    然后运行程序

    查看数据库的数据

    盖伦少了1000元,赵信余额没有变!

    这样,赵信就坑了!!!

    【改进】

    所需要的函数

    con.setAutoCommit(false); // 取消自动提交

    con.rollback(); // 回滚

    con.commit(); // 提交事务

                 Connection conn=null;
    		try {
    			conn = dbUtil.getConnection();
    			System.out.println("盖伦正在给赵信转账1000元");
    			conn.setAutoCommit(false);//取消自动提交
    			outMoney(conn,"盖伦",1000);
    			inMoney(conn,"赵信",1000);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			try {
    				conn.rollback();//回滚
    			} catch (SQLException e1) {
    				e1.printStackTrace();
    			}
    			e.printStackTrace();
    		}finally{
    			try {
    				conn.commit();//提交
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}    
    

      

  • 相关阅读:
    一些鲜为人知的编程真相
    一些鲜为人知的编程真相
    Ruby 1.9不会杀死Python
    Boost.Asio和ACE之间关于Socket编程的比较
    Effective C++第17条:要在单独的语句中使用智能指针来存储由new创建的对象
    Ruby 1.9不会杀死Python
    Boost智能指针——weak_ptr
    对象生死劫 - 构造函数和析构函数的异常
    Protocol Buffers:Google 的数据交换格式
    根据出生日期计算年龄
  • 原文地址:https://www.cnblogs.com/void-m/p/6143540.html
Copyright © 2011-2022 走看看