We present effiecient and flexible methods which permit read-only transactions that do not mind reading a possibly slightly old, but still consistent, version of the data base to execute without acquiring locks. this approach avoids the undesirable interferences between such queries and the typically shorter update transactions that cause unnecessary and costly delays. indexed acces by such queries is also supported, unlike by the earlier methods. old versions of records are maintained only in a transient fashion. our methods are characterized by their flexbility ( number of versions maintained and the timing of version switches, supporting partial rollbacks, and different recovery and buffering methods) and their efficiency (logging, garbage collection, version selection, and incremental, record level versioning). distributed data base environments are also supported, including commit protocls with the read-only optimization. we also describe efficient methods for garbage collecting unneeded older versions.