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
-> "die Art, wie wir den Fall behandeln" –
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. –
@PhilSchwartz Ich habe die Frage mit Code aktualisiert. –