text: Title: post_update UPDATE statement will bump version_id a second time, but also not get the correct value if a committed_state is present
  Body: ### Discussed in https://github.com/sqlalchemy/sqlalchemy/discussions/10798
  
  ```py
  from sqlalchemy import Column
  from sqlalchemy import create_engine
  from sqlalchemy import ForeignKey
  from sqlalchemy import Integer
  from sqlalchemy.orm import declarative_base
  from sqlalchemy.orm import relationship
  from sqlalchemy.orm import Session
  
  Base = declarative_base()
  engine = create_engine("sqlite://", echo=True)
  
  
  class User(Base):
      __tablename__ = "user"
  
      id = Column(Integer, primary_key=True)
  
  
  class Parent(Base):
      __tablename__ = "parent"
  
      id = Column(Integer, primary_key=True)
      version_id = Column(Integer)
      updated_by_id = Column(
          Integer,
          ForeignKey("user.id"),
          default=1,
          onupdate=1,
      )
  
      updated_by = relationship(
          "User",
          foreign_keys=[updated_by_id],
          post_update=True,
      )
  
      __mapper_args__ = {
          "version_id_col": version_id,
      }
  
  
  Base.metadata.create_all(engine)
  with Session(engine) as session:
      u1 = User(id=1)
      u2 = User(id=2)
      p1 = Parent(id=1, updated_by=u1)
      session.add(u1)
      session.add(u2)
      session.add(p1)
  
      u2id = u2.id
      session.commit()
  
  with Session(engine) as session:
      p1 = session.get(Parent, 1)
      p1.updated_by
      p1.version_id = p1.version_id
      p1.updated_by_id = u2id
      session.commit()
  
  ```
  
  output:
  
  ```
  2023-12-28 15:39:05,107 INFO sqlalchemy.engine.Engine BEGIN (implicit)
  2023-12-28 15:39:05,108 INFO sqlalchemy.engine.Engine SELECT parent.id AS parent_id, parent.version_id AS parent_version_id, parent.updated_by_id AS parent_updated_by_id 
  FROM parent 
  WHERE parent.id = ?
  2023-12-28 15:39:05,108 INFO sqlalchemy.engine.Engine [generated in 0.00006s] (1,)
  2023-12-28 15:39:05,109 INFO sqlalchemy.engine.Engine SELECT user.id AS user_id 
  FROM user 
  WHERE user.id = ?
  2023-12-28 15:39:05,109 INFO sqlalchemy.engine.Engine [generated in 0.00006s] (1,)
  2023-12-28 15:39:05,110 INFO sqlalchemy.engine.Engine UPDATE parent SET version_id=?, updated_by_id=? WHERE parent.id = ? AND parent.version_id = ?
  2023-12-28 15:39:05,110 INFO sqlalchemy.engine.Engine [generated in 0.00007s] (2, 2, 1, 1)
  2023-12-28 15:39:05,110 INFO sqlalchemy.engine.Engine UPDATE parent SET version_id=?, updated_by_id=? WHERE parent.id = ? AND parent.version_id = ?
  2023-12-28 15:39:05,110 INFO sqlalchemy.engine.Engine [cached since 0.0002746s ago] (2, 2, 1, 1)
  2023-12-28 15:39:05,110 INFO sqlalchemy.engine.Engine ROLLBACK
  Traceback (most recent call last):
    File "/home/classic/dev/sqlalchemy/test4.py", line 61, in <module>
      session.commit()
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 1969, in commit
      trans.commit(_to_root=True)
    File "<string>", line 2, in commit
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/state_changes.py", line 139, in _go
      ret_value = fn(self, *arg, **kw)
                  ^^^^^^^^^^^^^^^^^^^^
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 1256, in commit
      self._prepare_impl()
    File "<string>", line 2, in _prepare_impl
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/state_changes.py", line 139, in _go
      ret_value = fn(self, *arg, **kw)
                  ^^^^^^^^^^^^^^^^^^^^
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 1231, in _prepare_impl
      self.session.flush()
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 4317, in flush
      self._flush(objects)
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 4452, in _flush
      with util.safe_reraise():
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/util/langhelpers.py", line 146, in __exit__
      raise exc_value.with_traceback(exc_tb)
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/session.py", line 4413, in _flush
      flush_context.execute()
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py", line 466, in execute
      rec.execute(self)
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/unitofwork.py", line 629, in execute
      persistence.post_update(self.mapper, states, uow, cols)
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/persistence.py", line 157, in post_update
      _emit_post_update_statements(
    File "/home/classic/dev/sqlalchemy/lib/sqlalchemy/orm/persistence.py", line 1382, in _emit_post_update_statements
      raise orm_exc.StaleDataError(
  sqlalchemy.orm.exc.StaleDataError: UPDATE statement on table 'parent' expected to update 1 row(s); 0 were matched.
  ```
  
  a naive fix is to clear out committed_state of the version_id after we know we have operated on the row already:
  
  ```diff
  diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py
  index 3f537fb76..263009532 100644
  --- a/lib/sqlalchemy/orm/persistence.py
  +++ b/lib/sqlalchemy/orm/persistence.py
  @@ -1634,6 +1634,10 @@ def _postfetch(
       ):
           prefetch_cols = list(prefetch_cols) + [mapper.version_id_col]
   
  +        state.committed_state.pop(
  +            mapper._version_id_prop.key, None
  +        )
  +
       refresh_flush = bool(mapper.class_manager.dispatch.refresh_flush)
       if refresh_flush:
           load_evt_attrs = []
  
  ```
  
  but i think this should be more robust than that