Hello Remko,
Just to clear any confusion, the product I was referring to was “Firestore in Datastore mode”. Although the names are similar, “Firestore” and “Firebase” are different in that “Firebase” is a development platform and “Firestore” is the new-generation of NoSQL Cloud Database.
In the past, you were using the “Datastore” product and the DB API library to access the database in that product. On January 31st 2019, “Cloud Firestore” became Generally Available [1]. Afterward, an automatic upgrade to Firestore was executed (see [2] for more details), and we made available the new product available in Datastore mode. Although this allows users of the legacy Datastore still feel at home, the architecture of Firestore is different and this is why we recommend migrating from DB to the NDB client library. Here [3] is the correct documentation I meant to send you in my previous message about this migration. You may use it as reference to compare with your own implementation to target potential issues leading to the contention errors.
So to address your inquiry, switching to a different library is not directly what causes the data to be held in a different architectural product, but the fact that this new library is optimized to work with the new product being Firestore. Therefore, I recommend looking at the limits specific to Firestore as outlined here [4], which may be different than the ones for Datastore, and test how your application queries it resulting in more than 1/sec mutations on a single entity group. Please note that cross entity group contention can cause unavailability, so reading an entity group in a transaction counts as a “write” and thus is limited to 1 per second. For a transaction across entities, all participant entities must be uncontended in order for the transaction to succeed.
Let me know if you need further help.