事務處理-回滾(轉賬操作)


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();
			}
		}    

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM