1 example

Lost update

Concurrent updates overwrite each other unintentionally.

[ FAQ1 ]

What is a lost update?

A lost update happens when two or more concurrent transactions read the same data record and attempt to update it separately without recognizing each other's changes. Due to inadequate transaction isolation or missing concurrency controls, the last committed transaction unintentionally overwrites previous updates, causing earlier changes to be lost. This condition is a form of race condition frequently encountered in concurrent systems, particularly in databases using insufficient isolation levels. Lost updates significantly impact data accuracy, consistency, and reliability, causing discrepancies in critical business data.
[ FAQ2 ]

How to prevent lost updates

To prevent lost updates, ensure proper concurrency control and transaction isolation in database operations. Employ higher isolation levels in SQL databases, such as "Repeatable Read" or "Serializable," to effectively manage concurrent data access. Use pessimistic locking (like SELECT FOR UPDATE in SQL databases) to explicitly lock data records during critical updates, ensuring exclusive access. Alternatively, implement optimistic concurrency control strategies, such as versioning or timestamping, allowing detection and handling of conflicting updates before committing changes. Regularly test concurrency scenarios and configure your database transaction logic appropriately to reliably prevent lost updates.
diff block
return !existingWorkspace;
}
+
+ async getCustomDomainDetailsAndToggleIsCustomDomainEnabled(
+ workspace: Workspace,
+ ) {
+ if (!workspace.customDomain) return undefined;
+
+ const result = await this.domainManagerService.getCustomDomainDetails(
+ workspace.customDomain,
+ );
+
+ if (!result) {
+ return undefined;
+ }
+
+ const isCustomDomainWorking = result.records.some(
+ ({ status }) => status !== 'success',
+ );
+
+ if (workspace.isCustomDomainEnabled !== isCustomDomainWorking) {
+ workspace.isCustomDomainEnabled = isCustomDomainWorking;
+ this.workspaceRepository.save(workspace);
Greptile
greptile
logic: Missing await on save operation. Could lead to race conditions or lost updates
suggested fix
+ await this.workspaceRepository.save(workspace);