The finalized JDBC 4.0 spec explicitly states that updateRow() called on a ResultSet whos concurrency level is ResultSet.CONCUR_UPDATABLE, and without changes to any row, will be treated as a no-op.
A no-op should not result in throwing an exception - so both embedded and client drivers needs to change IMHO.
For the embedded driver:
A check for any updated rows before calling checksBeforeUpdateOrDelete() in updateRow() is probably in order, as checksBeforeUpdateOrDelete() is also used for deleteRow() and cancelRowUpdates().
For client driver:
Same as embedded, but check before calling checkForClosedResultSet() in updateRowX().