## Borrar una Fila

Hasta ahora, hemos visto cómo actualizar un valor y cómo insertar una nueva fila. Borrar una fila es la tercera forma de modificar un objeto ResultSet, y es la más simple. Todo lo que tenemos que hacer es mover el cursor a la fila que queremos borrar y luego llamar al método deleteRow. Por ejemplo, si queremos borrar la cuarta fila de la hoja de resultados uprs, nuestro código se parecería a esto:

    uprs.absolute(4);
    uprs.deleteRow();

La cuarta fila ha sido eliminada de uprs y de la base de datos.

El único problema con las eliminaciones es lo que ResultSet realmente hace cuando se borra una fila. Con algunos driver JDBC, una línea borrada es eliminada y ya no es visible en una hoja de resultados. Algunos drives JDBC utilizan una fila en blanco en su lugar pone (un "hole") donde la fila borrada fuera utilizada. Si existe una fila en blanco en lugar de la fila borrada, se puede utilizar el método absolute con la posición original de la fila para mover el cursor, porque el número de filas en la hoja de resultados no ha cambiado.

En cualquier caso, deberíamos recordar que los drivers JDBC manejan las eliminaciones de forma diferente. Por ejemplo, si escribimos una aplicación para ejecutarse con diferentes bases de datos, no deberíamos escribir código que dependiera de si hay una fila vacía en la hoja de resultados.

#### Ver los cambios en una Hoja de Resultados

Si modificamos los datos en un objeto ResultSet, los cambios se harán visibles si lo cerramos y lo abrimos de nuevo. En otras palabras, si re-ejecutamos la misma petición, producirá una nueva hoja de resultados, basada en los datos actuales de la tabla. Esta hoja de resultados reflejara naturalmente los cambios que hayamos hecho anteriormente.

La cuestión es si podemos ver los cambios que hayamos realizado mientras el objeto ResultSet esté todavía abierto. (Generalmente, estaremos más interesados en los cambios hechos por otros). La respuesta depende del controlador de la base de datos, del driver, y del tipo del objeto ResultSet utilizado.

Con un objeto ResultSet que sea TYPE_SCROLL_SENSITIVE, siempre podremos ver las actualizaciones que alguien haga en los valores de las columnas. Normalmente veremos inserciones y eliminaciones, pero la única forma de estar seguros es utilizar los métodos DatabaseMetaData que devuelven esta información.

Podemos regular la extensión de que los cambios sean visibles aumentando o bajando el nivel de aislamiento de la transación con la base de datos. Por ejemplo, la siguiente línea de código, donde con es un objeto Connection activo, selecciona el nivel de aislamiento de la conexión a TRANSACTION_READ_COMMITTED:

    con.setTransactionIsolation(TRANSACTION_READ_COMMITTED);

Con este nivel de aislamiento, nuestro objeto ResultSet no mostrará ningún cambio antes de ser enviado, pero puede mostrar los cambios que podrían tener problemas de consistencia. Para permitir menores niveles de inconsistencia, podríamos subir el nive de aislamiento a TRANSACTION_REPEATABLE_READ. El problema es que a niveles más altos de aislamiento, el rendimiento se empobrece. Y siempre estamos limitados por lo que proporcionan las bases de datos y los drivers.

En un objeto ResultSet que sea TYPE_SCROLL_INSENSITIVE, generalmente no podremos ver los cambios hechos mientras esté abierta. Algunos programadores utilizan sólo este tipo de objeto ResultSet porque quieren una vista consistente de los datos y no quieren ver los cambios hechos por otros.

Se puede utilizar el método refreshRow para obtener los últimos valores de una fila en la base de datos. Este método puede utilizar muchos recursos, especialmente si el controlador de la base de datos devuelve múltiples filas cada vez que se llama a refreshRow. De todas formas, puede utilizarse cuando es crítico tener los últimos datos. Incluso aunque una hoja de resultados sea sensible y los cambios sean visibles, una aplicación no podría ver siempre los últimos cambios si el driver recupera varias filas a la vez y las almacena. Por eso, utilizar el método refreshRow es el único método para asegurarnos que estamos viendo los últimos datos.

El siguiente código ilustra cómo una aplicación podría utilizar el método refreshRow cuando es absolutamente crítico ver los últimos valores. Observa que la hoja se resultados debería ser sensible; si queremos utilizar el método refreshRow con un objeto ResultSet que sea TYPE_SCROLL_INSENSITIVE, no hará nada. (La urgencia de obtener los últimos datos es bastante improvable en la tabla COFFEES, pero la fortuna de un inversor, depende de conocer los últimos precios en la amplia fluctuación del mercado del café. O, por ejemplo, querriamos asegurarnos de que el nuestro asiento reservado en el avión de regreso todavía está disponible).

    Statement stmt = con.createStatement(
    				ResultSet.TYPE_SCROLL_SENSITIVE,
    				ResultSet.CONCUR_UPDATABLE);
    ResultSet uprs = stmt.executeQuery(SELECT COF_NAME, PRICE FROM COFFEES);
    uprs.absolute(4);
    Float price1 = uprs.getFloat("PRICE");
    // do something. . .
    uprs.absolute(4);
    uprs.refreshRow();
    Float price2 = uprs.getFloat("PRICE");
    if (price2 > price1) {
    	// do something. . .
    }

Ozito