2015-02-05 2 views
0

Я пытался изменить статус автоматического фиксации и обновить его позже в зависимости от состояния. Но один раз в 10 раз данные не становятся фиксированными, поскольку статус автоматической фиксации изменяется каким-то образом. Я не могу узнать, как это сделать.Autocommit не всегда все время

Я приложил свой код ниже.

removeEmployee(){ 
     conn = DbManager.getConnection(); 
     conn.setAutoCommit(false); 
     stat = conn.createStatement(); 
     int updated = stat.executeUpdate(updateSql); 
     if (updated > 0) { 
      boolean credit = isCreditPeding(); 
      System.out.println("Is Credit:"+credit); 
      if(credit){ 
       System.out.println("Condition"+!conn.getAutoCommit()); 
       if (!conn.getAutoCommit()) { 
        conn.setAutoCommit(false); 
        conn.commit(); 
       } 
       conn.setAutoCommit(true); 
       return true; 
      }else{ 
       conn.rollback(); 
       conn.setAutoCommit(true); 
      } 
     } 
    } 

Result (During error) 
Is Credit:true 
condition:false 

Соединение не модифицировано в методе isCreditPending(). Запись не выполняется, даже если я звоню setAutocommit(true).

ответ

1

Запись не совершена, даже если я звоню setAutocommit (true).

Это не будет. Вам придется явно зафиксировать это, поскольку вы установили autoCommit в false в начале вашего метода.

removeEmployee(){ 
     boolean committed = false; 
     conn = DbManager.getConnection(); 
     boolean initValue = conn.getAutoCommit(); //save the initial value 
     conn.getAutoCommit(false); //explicitly set it to false to control the transaction 
     stat = conn.createStatement(); 
     int updated = stat.executeUpdate(updateSql); 
     if (updated > 0) { 
      boolean credit = isCreditPeding(); 
      System.out.println("Is Credit:"+credit); 
      if(credit){ 
       con.commit();//explicitly commit 
       committed = true; 
      }else{ 
       conn.rollback();//explicitly rollback 
      }    
     }    
    } 
    con.setAutoCommit(initValue); 
    return committed; 
+0

Я упомянул об этом, потому что в java-документах autoComit говорится, что это ложь. ** ПРИМЕЧАНИЕ. Если этот метод вызывается во время транзакции и изменяется режим автоматической фиксации, транзакция фиксируется. Если вызывается setAutoCommit, и режим автоматической фиксации не изменяется, вызов не работает. ** –

+1

Вы правы. Это так. И вы видите беспорядочное поведение. ИМХО, лучше контролировать свои транзакции с явными коммитами и/или откатами. http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html – ramp

Смежные вопросы