SQL隔离级别

时间:2017-05-12 05:12:16

标签: sql sql-server isolation-level

我们在应用程序中使用可序列化的会话隔离。预期的行为是,当用户要插入新行时,应该检查是否存在具有相同键的行,并在找到行时更新相同的行。但我发现在SQL Server中为同一个密钥创建了多行。这是隔离问题还是我们处理案件的方式?

以下是我正在使用的代码,

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

谢谢, Kishor Koli

1 个答案:

答案 0 :(得分:1)

设置数据库的方式存在问题。您需要一个唯一约束来强制实现唯一性。您可以在插入时检查所有您喜欢的但是一个独特的约束是它100%工作的唯一方式,因此在插入之前只是浪费时间选择,希望您能防止重复。插入,捕获异常/错误或继续。