A forward only updatable result set maintains a cursor which can only move in one direction (forward), and also update rows.
Example of using ResultSet.updateXXX() + ResultSet.updateRow() to update a row:
  Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
                                        ResultSet.CONCUR_UPDATABLE);
  ResultSet uprs = stmt.executeQuery(
    "SELECT FIRSTNAME, LASTNAME, WORKDEPT, BONUS " +
    "FROM EMPLOYEE");
  while (uprs.next()) {
      int newBonus = uprs.getInt("BONUS") + 100;
      uprs.updateInt("BONUS", newBonus);
      uprs.updateRow();
  }
Example of using ResultSet.deleteRow() to delete a row:
  Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
                                        ResultSet.CONCUR_UPDATABLE);
  ResultSet uprs = stmt.executeQuery(
    "SELECT FIRSTNAME, LASTNAME, WORKDEPT, BONUS " +
    "FROM EMPLOYEE");
  while (uprs.next()) {
      if (uprs.getInt("WORKDEPT")==300) {
         uprs.deleteRow();
      }
  }
The current row of the result set cannot be changed by other transactions, since it will be locked with an update lock. Result sets held open after a commit have to move to the next row before allowing any operations on it.
Some conflicts may prevent the result set from doing updates/deletes: