ZODB5
-----

zconn.db._storage always provides IMVCCStorage - either raw storage provides it,
or DB wraps raw storage with MVCCAdapter.

MVCCAdapter in turn uses either MVCCAdapterInstance (current) or
HistoricalStorageAdapter, or UndoAdapterInstance. Retriving zconn.at from those:

MVCCAdapterInstance
    ._start

HistoricalStorageAdapter
    ._before

UndoAdapterInstance
    # no way to retrieve `at`, but .undo_instance() through which
    # UndoAdapterInstance is returnerd, is not used anywhere.


For the reference: FileStorage, ZEO and NEO do not provide IMVCCStorage, thus
for them we can rely on MVCCAdapterInstance.

RelStorage is IMVCCStorage - TODO: how to extract at.


ZODB4
-----

Connection:
    .before     !None for historic connections

    ._txn_time  - if !None - set to tid of _next_ transaction
                  XXX set to None initially - what to do?

    # XXX do something like that ZODB5 is doing:
    zconn._start = zconn._storage.lastTransaction() + 1
    # XXX _and_ check out queued invalidations


ZODB3
-----

TODO












----------------------------------------





zconn._storage








DB.getTid(at, before)
