在事务管理的情况下不抛出自定义异常

时间:2014-07-17 06:23:58

标签: java exception jdbc transactions

当我给amt > sabal并期望其他分支应该执行(抛出自定义异常)但它没有执行相应的catch。

此计划中的逻辑错误在哪里?是否因为setAutoCommit仍为false或其他逻辑错误而发生?

班级帐户:

package com.jlcindia.transactionmanagement;

import java.sql.*;

public class Account {

int dabal,sabal,amt;

public void transfer(int sa,int da,int bal){

    amt=bal;
    Connection con=null;
    Statement st=null;
    ResultSet rs=null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost:3306/jlcstudents","root","garima");
        st=con.createStatement();

        rs=st.executeQuery(String.format("select bal from account where acc_no=%d",da));
        if(rs.next())
            dabal=rs.getInt(1);
        else
            throw new InvalidAccountNumber(da);

        rs=st.executeQuery(String.format("select bal from account where acc_no=%d", sa));
        if(rs.next())
            sabal=rs.getInt(1);
        else 
            throw new InvalidAccountNumber(da);
    }
    catch(Exception e){
        e.printStackTrace();
        }


    try{
        con.setAutoCommit(false);
        if(amt<=sabal){
        String qry=String.format("update account set bal=%d+%d where acc_no=%d", dabal,bal,da);
        st.executeUpdate(qry);

        String qry1=String.format("update account set bal=%d-%d where acc_no=%d", sabal,bal,sa);
        st.executeUpdate(qry1);

        con.commit();
        System.out.println("Transaction successfull");

        }
        else 
            throw new InsufficientFundException();

        } catch (Exception e) {
        try{
        con.rollback();
        System.out.println("Transaction rollbacked");
        }
        catch(SQLException e1){
            e1.printStackTrace();
        }

    }
    finally{
        try{
        if(st!=null)
            st.close();
        if(con!=null)
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
    }
}

}

Class Lab25:

package com.jlcindia.transactionmanagement;

public class Lab25 {
     public static void main(String[] args){
       Account acc=new Account();
       acc.transfer(1, 2, 10000);
     }
}

1 个答案:

答案 0 :(得分:0)

尝试围绕if else语句提供大括号。 可能会有所帮助

if(condition){
statements.....
}
else{
statements....
}

第二个解决方案是 您必须每次都创建一个新的语句对象而不是使用前一个。 当一个对象的工作完成时,通过调用

来关闭它
statementObject.close();