A computer implemented method comprising: receiving at least a first group of transaction logs from a first database at a second database; dispatching the transaction logs in the first group to a plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530); after determining that the dispatching of the first group of transaction logs is complete, generating an end-of-group transaction log indicative of an end of the first group of transaction logs and allocating the end-of-group transaction log to each of the plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530); group-wise parallel replaying at the second database the transaction logs from each of the plurality of replay queues including the end-of-group transaction logs allocated to each of the plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530), updating a system timestamp at an end of each respective group of transaction logs after each end-of-group transaction log has been replayed from each queue (1331, 1332, 1333; 1510, 1520, 1530) to match the lower of (i) a lowest pre-commit timestamp associated with any transaction for which an associated commit log has not been replayed; and (ii) the largest commit timestamp associated with any transaction for which an associated commit log has been replayed; receiving a query at the second database and assigning a snapshot identification to the query, wherein the snapshot identification is associated with the current system timestamp; and returning, in response to the query, only visible database records, wherein visible database records have an associated commit timestamp less than or equal to the snapshot identification. receiving at least a first group of transaction logs from a first database at a second database; dispatching the transaction logs in the first group to a plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530); after determining that the dispatching of the first group of transaction logs is complete, generating an end-of-group transaction log indicative of an end of the first group of transaction logs and allocating the end-of-group transaction log to each of the plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530); group-wise parallel replaying at the second database the transaction logs from each of the plurality of replay queues including the end-of-group transaction logs allocated to each of the plurality of replay queues (1331, 1332, 1333; 1510, 1520, 1530), updating a system timestamp at an end of each respective group of transaction logs after each end-of-group transaction log has been replayed from each queue (1331, 1332, 1333; 1510, 1520, 1530) to match the lower of (i) a lowest pre-commit timestamp associated with any transaction for which an associated commit log has not been replayed; and (ii) the largest commit timestamp associated with any transaction for which an associated commit log has been replayed; receiving a query at the second database and assigning a snapshot identification to the query, wherein the snapshot identification is associated with the current system timestamp; and returning, in response to the query, only visible database records, wherein visible database records have an associated commit timestamp less than or equal to the snapshot identification.