2017-05-12 5 views
-2

Wir verwenden die serialisierbare Sitzungsisolierung in unserer Anwendung. Das beabsichtigte Verhalten ist, dass wenn ein Benutzer eine neue Zeile einfügt, sollte es - sollte das Vorhandensein der Zeile mit dem gleichen Schlüssel überprüfen und das gleiche aktualisieren, wenn die Zeile gefunden wird. Aber ich habe mehrere Zeilen für den gleichen Schlüssel in SQL Server gefunden. Geht es um Isolation oder die Art und Weise, wie wir den Fall behandeln?SQL-Isolationsstufe

Es folgt der Code, den ich verwende,

private int getNextNumber(String objectName, Connection sqlConnection) throws SQLException { 
    // TODO Auto-generated method stub 
    int number = 0; 

    try{ 

     sqlConnection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 

     System.out.println("##### Transaction isolation set : " + sqlConnection.getTransactionIsolation()); 

     Statement stmt = sqlConnection.createStatement(); 
     ResultSet rs = stmt.executeQuery("select * from [dbo].[db] where DocumentNumber = '" + objectName.toString() + "' FOR UPDATE"); 

     while(rs.next()) { 
      printNumber = rs.getInt("PrintNumber"); 
     } 


     System.out.println("#### Print number found from sql is : " + printNumber); 

     if(printNumber == 0) { 
      printNumber = printNumber + 1; 
      stmt.execute("INSERT INTO [dbo].[db] (number, DocumentNumber) VALUES (1 ,'" + objectName.toString() + "')"); 
     } else { 
      number = number + 1; 
      stmt.execute("UPDATE [dbo].[db] SET Number =" + number + " WHERE DocumentNumber ='" + objectName.toString() + "'"); 
     } 

     //sqlConnection.commit(); 
    }catch(Exception e) { 
     sqlConnection.rollback(); 
     e.printStackTrace(); 
    } finally { 
     sqlConnection.commit(); 
    } 
    return number; 
} 

Danke, Kishor Koli

+0

-> "die Art, wie wir den Fall behandeln" –

+2

Können Sie den Code, der den "Fall" behandelt, posten? Verwenden Sie eine Zusammenführungsanweisung? Verwenden Sie die EXISTS-Prüfung für alte Mode mit einer ordnungsgemäß umschlossenen expliziten Transaktion für den gesamten Block? Brauchen Sie mehr Informationen. –

+0

@PhilSchwartz Ich habe die Frage mit Code aktualisiert. –

Antwort

1

Es ist ein Problem mit der Art und Weise Ihrer Datenbank eingerichtet ist. Sie benötigen eine eindeutige Einschränkung, um die Eindeutigkeit zu erzwingen. Sie können zum Zeitpunkt des Einfügens alles überprüfen, was Sie wollen, aber eine einmalige Einschränkung ist die einzige Art, wie es 100% funktioniert. Es ist also nur eine Verschwendung von Zeit, bevor Sie es einfügen, in der Hoffnung, dass Sie ein Duplikat verhindern. Fügen Sie die Ausnahme/den Fehler ein oder fahren Sie fort.