A computer implemented method, comprising: in response to a first transaction being started, opening a transaction workspace view of a live workspace of a parent database at a first time, the parent database comprising a number of database records and the opening of the transaction workspace view instantiating a snapshot of the live workspace of the parent database; creating a data structure , the data structure arranged to include any changes from further transactions which are committed to the parent database while the first transaction is open; within the first transaction, making a first change within the transaction workspace view to data relating to a first record of the parent database ; attempting to commit the first change in the parent database at a second time that is later than the first time , wherein attempting to commit the first change comprises: recursively searching the data structure to identify further transactions having acted on the first record , and for any further records acted upon by the further transactions , identifying any still further transactions having acted upon the further records , until no further transactions are found ; refreshing the transaction workspace view of the first transaction with the changes to the records acted upon by the further transactions identified in the recursive search ; resolving any conflicts between the first change and the changes to the records acted upon by the further transactions based on the refreshed transaction workspace view ; and committing the first change in dependence on any resolved conflicts . in response to a first transaction being started, opening a transaction workspace view of a live workspace of a parent database at a first time, the parent database comprising a number of database records and the opening of the transaction workspace view instantiating a snapshot of the live workspace of the parent database; creating a data structure , the data structure arranged to include any changes from further transactions which are committed to the parent database while the first transaction is open; within the first transaction, making a first change within the transaction workspace view to data relating to a first record of the parent database ; attempting to commit the first change in the parent database at a second time that is later than the first time , wherein attempting to commit the first change comprises: recursively searching the data structure to identify further transactions having acted on the first record , and for any further records acted upon by the further transactions , identifying any still further transactions having acted upon the further records , until no further transactions are found ; refreshing the transaction workspace view of the first transaction with the changes to the records acted upon by the further transactions identified in the recursive search ; resolving any conflicts between the first change and the changes to the records acted upon by the further transactions based on the refreshed transaction workspace view ; and committing the first change in dependence on any resolved conflicts . recursively searching the data structure to identify further transactions having acted on the first record , and for any further records acted upon by the further transactions , identifying any still further transactions having acted upon the further records , until no further transactions are found ; refreshing the transaction workspace view of the first transaction with the changes to the records acted upon by the further transactions identified in the recursive search ; resolving any conflicts between the first change and the changes to the records acted upon by the further transactions based on the refreshed transaction workspace view ; and committing the first change in dependence on any resolved conflicts . <EOS>