A computer-implemented method of performing snapshot isolation in distributed databases, comprising: implementing, on a plurality of hardware devices, a plurality of nodes that implement a distributed database; storing, by the plurality of nodes, a plurality of local snapshot information, wherein for a particular node a corresponding local snapshot information enforces snapshot isolation for the particular node; partially processing, by a first node of the plurality of nodes, a distributed transaction; begin calculating an interval [y,z) of snapshots that the distributed transaction may read on other nodes of the plurality of nodes by checking locally on the first node whether other distributed transactions have committed since the distributed transaction started, wherein the interval starts with a distributed transaction y that committed last before the distributed transaction began and ignores a distributed transaction z that committed next after y; if another transaction has committed on the first node since the distributed transaction started, using a global commit identifier of the other transaction; if no other transaction has committed on the first node, - sending, by the first node to a hardware coordinator, a request to access a second node of the plurality of nodes, wherein the hardware coordinator coordinates all distributed transactions; and - receiving, by the first node from the hardware coordinator, a global commit identifier; and continuing to process the distributed transaction, by the first node and the second node, in accordance with the global commit identifier by using the most recent snapshot of the second node that ignores the distributed transaction z. implementing, on a plurality of hardware devices, a plurality of nodes that implement a distributed database; storing, by the plurality of nodes, a plurality of local snapshot information, wherein for a particular node a corresponding local snapshot information enforces snapshot isolation for the particular node; partially processing, by a first node of the plurality of nodes, a distributed transaction; begin calculating an interval [y,z) of snapshots that the distributed transaction may read on other nodes of the plurality of nodes by checking locally on the first node whether other distributed transactions have committed since the distributed transaction started, wherein the interval starts with a distributed transaction y that committed last before the distributed transaction began and ignores a distributed transaction z that committed next after y; if another transaction has committed on the first node since the distributed transaction started, using a global commit identifier of the other transaction; if no other transaction has committed on the first node, - sending, by the first node to a hardware coordinator, a request to access a second node of the plurality of nodes, wherein the hardware coordinator coordinates all distributed transactions; and - receiving, by the first node from the hardware coordinator, a global commit identifier; and - sending, by the first node to a hardware coordinator, a request to access a second node of the plurality of nodes, wherein the hardware coordinator coordinates all distributed transactions; and - receiving, by the first node from the hardware coordinator, a global commit identifier; and continuing to process the distributed transaction, by the first node and the second node, in accordance with the global commit identifier by using the most recent snapshot of the second node that ignores the distributed transaction z.